Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.038 c
15-1166040455
palva
2006-12-13 23:07
2006.12.31
Gmail открыли для всех


15-1165577292
ocean
2006-12-08 14:28
2006.12.31
Запись звука с линейного выхода


15-1165512478
oxffff
2006-12-07 20:27
2006.12.31
generics ам быть говорит CodeGear


2-1165869822
AleksEraser
2006-12-11 23:43
2006.12.31
DLL


15-1165559328
Slider007
2006-12-08 09:28
2006.12.31
Не связанные друг с другом 2 вопроса ;) (видео, клиент форума)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский