Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с потоками


Страницы:   1 2

Danger-Lifter ©   (2006-12-07 16:28:00) 

Срочно! Приложение под Винду! Создается 2-ой поток - который крутиться в бесконечном (условно - до терминат по кнопке) цикле и выполняет некий набор операций! По сути - основная нагрузка приложения здесь! При этом напрочь отмирает поток ГУИ! т.е. перестают обрабатываться сообщения, таскаться окна, перерисовываться! Что делать, как этого избежать!  При этом рабочий поток необходимо  тормозить как можно меньше и не использовать виндовых примочек (типа waitforobject)! Практикой показано, что спасает sleep(1) на каждой итерации рабочего потока! Однако такая задержка не приемлима! есть другие варианты?


Danger-Lifter   (2006-12-13 14:02:00) [1]

ну так это и хотелось. А что тогда значит "и при этом ты подолжаешь утверждать, что твой доп.поток взаимодействует с GUI-потоком исключительно асинхронно."?


Сергей М.   (2006-12-13 13:25:00) [2]

Что тут пояснять ?

Да, PostMessage() работает анинхронно. Поток, ее использующий, ставит свое сообщение в очередь сообщений окна-адресата (это мгновенная операция) и "едет дальше". При этом постящему потоку глубоко фиолетово, когда его сообщение будет выбрано/обработано потоком-адресатом и будет ли оно вообще выбрано или обработано.


Danger-Lifter   (2006-12-13 13:08:00) [3]

Пост - как раз и есть асинхронное взаимодеййствие


Danger-Lifter   (2006-12-13 13:05:00) [4]

Не совсем понял - поясни...


Сергей М.   (2006-12-13 12:56:00) [5]


> не работает оптимизация update сообщений, т.к. они представляют
> собой в очереди "слоенный пирог" (добавить-перерисовать-
> добавить-перерисовать ...). Либо же просто компонент не
> приспособлен к такой интенсивности (пробовал накапливать
> строви и добавлять порциями - не помогло).


Если таки "постишь", то все это не имеет ни малейшего отношения к твоей проблеме, потому как этим занимается GUI-поток и при этом ты подолжаешь утверждать, что твой доп.поток взаимодействует с GUI-потоком исключительно асинхронно.


Danger-Lifter   (2006-12-13 12:42:00) [6]

постю


Сергей М.   (2006-12-13 08:11:00) [7]


> в лог пишут и не ГУЕвые потоки, создал свой Мессаг, который
> постю окну лога


post'ишь или send'ишь ?

Это крайне важно в твоей ситуации.


Danger-Lifter   (2006-12-13 08:05:00) [8]

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 сообщений, т.к. они представляют собой в очереди "слоенный пирог" (добавить-перерисовать-добавить-перерисовать ...). Либо же просто компонент не приспособлен к такой интенсивности (пробовал накапливать строви и добавлять порциями - не помогло).
Вообщем проблема пока еще висит - хочется иметь лог, который воспримет все, что ему отошлют! Возможно ли это?


Anatoly Podgoretsky   (2006-12-08 11:08:00) [9]

> Danger-Lifter  (08.12.2006 09:27:14)  [14]

Тебя просили привести кусок с Synhronize или нет?


oxffff   (2006-12-08 10:32:00) [10]

Вот тебе код

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 потока у тебя выше.
Если нет.

Тогда приведи код. А то батарейки на телепаторах у всех сядут.
Купи нам батарейки.


Сергей М.   (2006-12-08 10:07:00) [11]


> Danger-Lifter


Попробуй понизить приоритет доп.потока.

Судя по тому, что sleep() разрешает проблемную ситуацию, gui-поток не получает достаточного кол-ва квантов времени


Danger-Lifter   (2006-12-08 09:27:00) [12]


> Anatoly Podgoretsky ©   (07.12.06 20:00) [12]
> > Danger-Lifter  (07.12.2006 17:13:09)  [9]С твоей стороны
> тоже.

Что еще Вам рассказать - Выложить код рекогнайзера весь - не возможно!  общую идею я обрисовал! Второй поток с ГУИ связан только отсылкой сообщений, (postEvent) и все... Остальное - мат действия! Что конкретно нужно прояснить?


Danger-Lifter   (2006-12-08 09:24:00) [13]


> Джо-со-смарта   (07.12.06 18:08) [11]
> Собака порылась в Рекогнайзер, грешить на большее пока нет
> оснований.


А чем его реализация может влиять на ГУИшный поток? Хотя бы просто, например.


Anatoly Podgoretsky   (2006-12-07 20:00:00) [14]

> Danger-Lifter  (07.12.2006 17:13:09)  [9]

С твоей стороны тоже.


Джо-со-смарта   (2006-12-07 18:08:00) [15]

Собака порылась в Рекогнайзер, грешить на большее пока нет оснований.


Danger-Lifter   (2006-12-07 17:23:00) [16]

Спасибо за помощь! Вообщем реализовал такой алгоритм - помог:

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;


Если кто-то сможет предложить лучше или другие комментарии будут - приму и жду!


Danger-Lifter   (2006-12-07 17:13:00) [17]

И тишина....


Danger-Lifter   (2006-12-07 17:01:00) [18]

хорошо! есть поток который постоянно читает данные со звучка и добавляет в буфер объета Recognizer! В свою очередь из второго (вот этого тормозящего все) потока вызывается Recognizer.Process(); Который выбирает очередную порцию данных из буфера и выполняет мат расчеты (кпстр, Фурье и т.д.) Время выполнения одно вызова метода длиться от 0 до 500 мсек (зависит от того, что найдено в данных)! Вот и все. Все это должно крутиться бусконечно, пока не нажмут стоп!


Anatoly Podgoretsky   (2006-12-07 16:58:00) [19]

> Danger-Lifter  (07.12.2006 16:51:04)  [4]

Непонятно, что такое Recognizer и Process


Danger-Lifter   (2006-12-07 16:57:00) [20]

в какой синхронайз?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо