Индикатор выполнения и несколько потоков, GUI отделения и логики - какой шаблон разработки был бы лучшим?

Как насчет этого (комментарии объясняют код):

void coluna(int size, int board[size][size]){
    int not_zeros[size]; // Use to save the index of columns that contain at 
                         // least one number different than zero.
    int i, j;
    for(i=0; i<size; i++){
        not_zeros[i] = -1; //initialize the array.

    for (i=0; i<size; i++){
        int foundNotZero = 0;
        for (j=0; j<size; j++){
            if(board[j][i] != 0){ //line j, column i.
                foundNotZero = 1;
                break;
            }
        }
        if (foundNotZero == 1){ //at least one element of the column i is not zero.
            not_zeros[i] = i;
        }
    }
    int start = 0;
    for(i=0; i<size; i++){
        if (not_zeros[i] >= 0){ //copy column i to column start.
            for(j = 0; j<size; j++){
                board[j][start] = board[j][not_zeros[i]];
            }
            start++; //increment start.
        }
    }
    for(i=start; i<size; i++){
        for(j=0; j<size; j++){
            board[j][i] = 0; //fill the remaining columns with zeros.
        }
    }
}
5
задан Toon Krijthe 14 February 2009 в 19:34
поделиться

4 ответа

Я когда-то потратил большую часть недели, пытаясь сделать гладкое, non-hiccupy индикатор выполнения по очень сложному алгоритму.

Алгоритм имел 6 различных шагов. Каждый шаг имел характеристики синхронизации, которые серьезно зависели от A) базовые обработанные данные, не только "сумма" данных, но также и "тип" данных и B) 2 шагов, масштабируемых чрезвычайно хорошо с растущим числом CPU, 2 шага работали в 2 потоках, и 2 шага были эффективно однопоточными.

Соединение данных эффективно оказало намного большее влияние на время выполнения каждого шага, чем количество ядер.

Решение, которое наконец взломало его, было действительно довольно просто. Я сделал 6 функций, которые проанализировали набор данных и попытались предсказать фактическое время выполнения каждого аналитического шага. Эвристика в каждой функции, проанализированной и наборы данных при анализе и количество CPU. На основе данных во время выполнения из моих собственных 4 базовых машин каждая функция в основном возвратила количество миллисекунд, которые это, как ожидали, возьмет на моей машине.

f1 (..) + f2 (..) + f3 (..) + f4 (..) + f5 (..) + f6 (..) = общее время выполнения в миллисекундах

Теперь, учитывая эту информацию, можно эффективно знать, какой процент общего времени выполнения каждый шаг, как предполагается, берет. Теперь, если Вы говорите, что step1, как предполагается, берет 40% времени выполнения, в основном необходимо узнать, как испустить 40 1% событий из того алгоритма. Скажите, что для цикла обрабатывает 100 000 объектов, Вы могли, вероятно, сделать:

for (int i = 0; i < numItems; i++){
     if (i % (numItems / percentageOfTotalForThisStep) == 0) emitProgressEvent();
     .. do the actual processing ..
}

Этот алгоритм дал нам шелковистый гладкий индикатор выполнения, который работал безупречно. Ваша технология реализации может иметь различные формы в наличии масштабирования и функций в индикаторе выполнения, но основной образ мыслей о проблеме является тем же.

И да, действительно не имело значения, что эвристические ссылочные номера были разработаны на моей машине - единственная настоящая проблема состоит в том, если Вы хотите изменить числа при работе другой машины. Но Вы все еще знаете отношение (который является единственной действительно важной вещью здесь), таким образом, Вы видите, как Ваше локальное оборудование работает по-другому по сравнению с тем, которое я имел.

Теперь среднее число ТАК читатель может задаться вопросом, с какой стати кто-то провел бы неделю, делая гладкий индикатор выполнения. Функцию требовал главный продавец, и я полагаю, что он использовал ее на встречах продаж для получения контрактов. Переговоры по деньгам ;)

6
ответ дан 13 December 2019 в 22:18
поделиться

В ситуациях с потоками или асинхронными процессами/задачами как это, я нахожу полезным иметь абстрактный тип или объект в основном потоке, который представляет (и идеально инкапсулирует), каждый процесс. Так, для каждого рабочего потока по-видимому, будет объект (давайте назовем его Operation) в основном потоке для управления тем рабочим, и очевидно будет некоторая подобная списку структура данных для содержания этих Операций.

Где применимо, каждая Операция предоставляет запустить/остановить методы своему рабочему, и в некоторых случаях - такому как Ваш - числовые свойства, представляющие прогресс и ожидаемое общее время или работа задачи той конкретной Операции. Единицы должны не обязательно быть основаны на времени, если Вы знаете о выполнении 6 230 вычислений можно просто думать об этих свойствах как о количествах вычисления. Кроме того, каждая задача должна будет иметь некоторый способ обновить его Операцию владения его текущего прогресса любого механизма, является соответствующим (обратные вызовы, закрытия, диспетчеризация события, или безотносительно механизма, который Ваш язык программирования / поточная обработка платформы обеспечивает).

Таким образом, в то время как Ваша фактическая работа выполняется прочь в отдельных потоках, соответствующий Объект операции в "основном" потоке постоянно обновляется/уведомляется успеха его рабочего. Индикатор выполнения может обновить себя соответственно, отобразив общее количество "ожидаемых" времен Операций к его общему количеству, и общее количество времен "прогресса" Операций к его текущему прогрессу, любым способом имеет смысл для Вашей платформы индикатора выполнения.

Очевидно, существует тонна других соображений/работы, что потребности быть выполненным, на самом деле реализовывая это, но я надеюсь, что это дает Вам суть ее.

2
ответ дан 13 December 2019 в 22:18
поделиться

Палка с Наблюдателем / Заметный для такого рода вещи. Некоторый объект наблюдает различное серийное состояние потоков и отчетов об обработке путем обновления сводной панели.

1
ответ дан 13 December 2019 в 22:18
поделиться

Несколько индикаторов выполнения не являются такой плохой идеей, заметьте. Или возможно сложный индикатор выполнения, который показывает несколько выполнений потоков (как программы менеджера загрузок иногда имеют). Пока UI интуитивен, Ваши пользователи будут ценить дополнительные данные.

Когда я пытаюсь ответить на такие вопросы дизайна, я сначала пытаюсь посмотреть на подобные или аналогичные проблемы в другом приложении, и как они решены. Таким образом, я предложил бы, чтобы Вы провели некоторое исследование путем рассмотрения других заявлений, которые отображают сложный прогресс (как пример менеджера загрузок) и пытаются адаптировать существующее решение приложения.

Извините я не могу предложить более определенный дизайн, это - просто общие рекомендации.:)

1
ответ дан 13 December 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: