Форум: "Начинающим";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];
ВнизПроблема с потоками Найти похожие ветки
← →
Danger-Lifter (2006-12-07 16:28) [0]Срочно! Приложение под Винду! Создается 2-ой поток - который крутиться в бесконечном (условно - до терминат по кнопке) цикле и выполняет некий набор операций! По сути - основная нагрузка приложения здесь! При этом напрочь отмирает поток ГУИ! т.е. перестают обрабатываться сообщения, таскаться окна, перерисовываться! Что делать, как этого избежать! При этом рабочий поток необходимо тормозить как можно меньше и не использовать виндовых примочек (типа waitforobject)! Практикой показано, что спасает sleep(1) на каждой итерации рабочего потока! Однако такая задержка не приемлима! есть другие варианты?
← →
Германн © (2006-12-07 16:37) [1]
> Что делать, как этого избежать!
Не читать Архангельского :-)
← →
Dmitrij_K (2006-12-07 16:43) [2]
> При этом напрочь отмирает поток ГУИ!
Код покажи.
← →
Anatoly Podgoretsky © (2006-12-07 16:44) [3]> Danger-Lifter (07.12.2006 16:28:00) [0]
Есть предположение, что ты читал Архангельского. Это так?
← →
Danger-Lifter (2006-12-07 16:51) [4]Нет не читал - я самоучка! Кода много - если весь давать, а если не весь то так:
while true do
begin
Recognizer.Process(); - достаточно ресурсоемкая операция
end;
Что тут Вам поможет - непонятно!
← →
Германн © (2006-12-07 16:57) [5]
> Danger-Lifter (07.12.06 16:51) [4]
>
> Нет не читал - я самоучка! Кода много - если весь давать,
> а если не весь то так:
Лучше покажи, что ты в Синхронайз запихнул?
← →
Danger-Lifter (2006-12-07 16:57) [6]в какой синхронайз?
← →
Anatoly Podgoretsky © (2006-12-07 16:58) [7]> Danger-Lifter (07.12.2006 16:51:04) [4]
Непонятно, что такое Recognizer и Process
← →
Danger-Lifter (2006-12-07 17:01) [8]хорошо! есть поток который постоянно читает данные со звучка и добавляет в буфер объета Recognizer! В свою очередь из второго (вот этого тормозящего все) потока вызывается Recognizer.Process(); Который выбирает очередную порцию данных из буфера и выполняет мат расчеты (кпстр, Фурье и т.д.) Время выполнения одно вызова метода длиться от 0 до 500 мсек (зависит от того, что найдено в данных)! Вот и все. Все это должно крутиться бусконечно, пока не нажмут стоп!
← →
Danger-Lifter (2006-12-07 17:13) [9]И тишина....
← →
Danger-Lifter (2006-12-07 17:23) [10]Спасибо за помощь! Вообщем реализовал такой алгоритм - помог:
i := GetTickCount();
j := 0;
while true do
begin
Recognizer.Process();
j := GetTickCount() - i;
if j > TIME_REFRESH then
begin
sleep(1);
i := GetTickCount();
end;
end;
Если кто-то сможет предложить лучше или другие комментарии будут - приму и жду!
← →
Джо-со-смарта (2006-12-07 18:08) [11]Собака порылась в Рекогнайзер, грешить на большее пока нет оснований.
← →
Anatoly Podgoretsky © (2006-12-07 20:00) [12]> Danger-Lifter (07.12.2006 17:13:09) [9]
С твоей стороны тоже.
← →
Danger-Lifter (2006-12-08 09:24) [13]
> Джо-со-смарта (07.12.06 18:08) [11]
> Собака порылась в Рекогнайзер, грешить на большее пока нет
> оснований.
А чем его реализация может влиять на ГУИшный поток? Хотя бы просто, например.
← →
Danger-Lifter (2006-12-08 09:27) [14]
> Anatoly Podgoretsky © (07.12.06 20:00) [12]
> > Danger-Lifter (07.12.2006 17:13:09) [9]С твоей стороны
> тоже.
Что еще Вам рассказать - Выложить код рекогнайзера весь - не возможно! общую идею я обрисовал! Второй поток с ГУИ связан только отсылкой сообщений, (postEvent) и все... Остальное - мат действия! Что конкретно нужно прояснить?
← →
Сергей М. © (2006-12-08 10:07) [15]
> Danger-Lifter
Попробуй понизить приоритет доп.потока.
Судя по тому, что sleep() разрешает проблемную ситуацию, gui-поток не получает достаточного кол-ва квантов времени
← →
oxffff © (2006-12-08 10:32) [16]Вот тебе код
function ThreadProc(data:pointer):DWORD;stdcall;
begin
while true do;
end;
procedure TForm1.Button1Click(Sender: TObject);
var tid:DWORD;
begin
CreateThread(nil,0,@ThreadProc,nil,0,tid);
end;
Нажми пять раз на кнопку. Запустится пять потоков.
Загрузка 95%. Getmessage работает.
Если твой код примерно такой же.
Тогда скорее всего приоритет Recognizer потока у тебя выше.
Если нет.
Тогда приведи код. А то батарейки на телепаторах у всех сядут.
Купи нам батарейки.
← →
Anatoly Podgoretsky © (2006-12-08 11:08) [17]> Danger-Lifter (08.12.2006 09:27:14) [14]
Тебя просили привести кусок с Synhronize или нет?
← →
Danger-Lifter (2006-12-13 08:05) [18]oxffff © (08.12.06 10:32) [16]
есть ли уверенность,ч то в твоем коде все работает нормально? Что компилятор не оптимизировал код, что потоки выполняются вообще, а не просто запускаются и за не имением кода (пустой цикл)- тут же приостанавливаются?
Anatoly Podgoretsky © (08.12.06 11:08) [17]
Кусок с Recognizer - это тысячи строк кода, которые я не имею права распространять и выкладывать... Так что тут извиняйте...
Сергей М. © (08.12.06 10:07) [15]
Понижение и повышение приоритета потока ничего не изменяло в поведении приложения.
Однако Вы видимо правы - почему, потому как эта ситуация проявлялась, только при массовой бомбардировке лога сообщениями. Фишка в чем, так как в лог пишут и не ГУЕвые потоки, создал свой Мессаг, который постю окну лога. А тот при обработке это мессага, из ГУЕ вого, естественно, потока делает add(string). Интенсивность записи очень высокая (снижение решает все проблемы). есть предположение, что не работает оптимизация update сообщений, т.к. они представляют собой в очереди "слоенный пирог" (добавить-перерисовать-добавить-перерисовать ...). Либо же просто компонент не приспособлен к такой интенсивности (пробовал накапливать строви и добавлять порциями - не помогло).
Вообщем проблема пока еще висит - хочется иметь лог, который воспримет все, что ему отошлют! Возможно ли это?
← →
Сергей М. © (2006-12-13 08:11) [19]
> в лог пишут и не ГУЕвые потоки, создал свой Мессаг, который
> постю окну лога
post"ишь или send"ишь ?
Это крайне важно в твоей ситуации.
← →
Danger-Lifter (2006-12-13 12:42) [20]постю
← →
Сергей М. © (2006-12-13 12:56) [21]
> не работает оптимизация update сообщений, т.к. они представляют
> собой в очереди "слоенный пирог" (добавить-перерисовать-
> добавить-перерисовать ...). Либо же просто компонент не
> приспособлен к такой интенсивности (пробовал накапливать
> строви и добавлять порциями - не помогло).
Если таки "постишь", то все это не имеет ни малейшего отношения к твоей проблеме, потому как этим занимается GUI-поток и при этом ты подолжаешь утверждать, что твой доп.поток взаимодействует с GUI-потоком исключительно асинхронно.
← →
Danger-Lifter (2006-12-13 13:05) [22]Не совсем понял - поясни...
← →
Danger-Lifter (2006-12-13 13:08) [23]Пост - как раз и есть асинхронное взаимодеййствие
← →
Сергей М. © (2006-12-13 13:25) [24]Что тут пояснять ?
Да, PostMessage() работает анинхронно. Поток, ее использующий, ставит свое сообщение в очередь сообщений окна-адресата (это мгновенная операция) и "едет дальше". При этом постящему потоку глубоко фиолетово, когда его сообщение будет выбрано/обработано потоком-адресатом и будет ли оно вообще выбрано или обработано.
← →
Danger-Lifter (2006-12-13 14:02) [25]ну так это и хотелось. А что тогда значит "и при этом ты подолжаешь утверждать, что твой доп.поток взаимодействует с GUI-потоком исключительно асинхронно."?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.04 c