![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по потокам. [D7, XP]
dabreezy © (2006-02-07 18:57:00)Добрый вечер.
У меня такой вопрос по потокам (целый день башку ломаю)
есть процедура запуска потока (в ней цикл с сложными вычислениями):
procedure TMyThread1.Execute;
begin
...
repeat
until (terminated) or (i1=i-1);
...
synchronize (Thread_done);
end;
Далее функция Thread_done (thread_running - кол-во потоков):
procedure TMyThread1.Thread_done;
begin
form1.thread_running:=form1.thread_running-1;
end;
Так вот такая штука получается, когда все потоки завершены, то получается что иногда работает нормально(thread_runnig=0), а иногда thread_running=1 или 2. Причем чем больше потоков, тем чаще такое бывает! При 3х-6 потоков такое практически не бывает.
Объясните пожалуйста в чем дело.
Leonid Troyanovsky (2006-02-07 19:40:00) [21]
> dabreezy (07.02.06 19:34) [6]
> Так в том то и все дело, что synchronize (Thread_done);
> выполняется прямо перед концом функции. Должно вроде нормально
> работать, оно иногда и работает. Причем даже пробовал следующее:
Нормально должно работать в OnTerminate, при условии, конечно,
что thread_runnung инкрементируется правильно.
--
Regards, LVT.
dabreezy (2006-02-07 19:34:00) [22]
> Zeqfreed © (07.02.06 19:22) [5]
Так в том то и все дело, что synchronize (Thread_done); выполняется прямо перед концом функции. Должно вроде нормально работать, оно иногда и работает. Причем даже пробовал следующее: делал переменную у каждого потока flag. В начале функции flag=0, а в конце flag=1, все равно не помогает
Zeqfreed (2006-02-07 19:22:00) [23][2] Defunct © (07.02.06 19:11)
А чем это лучше обычного вызова метода формы в контексте основного потока?
dabreezy (07.02.06 18:57)
Все-таки мне кажется, что ошибка где-то в другом месте. Не в том коде, что Вы привели.
dabreezy (2006-02-07 19:19:00) [24]
> Defunct © (07.02.06 19:11) [2]
> оповещайте форму о завершении из потока с помощью PostMessage.
> В обработчике сообщения уменьшайте переменную thread_runnung.
>
А как это сделать?
dabreezy (2006-02-07 19:17:00) [25]
> Zeqfreed © (07.02.06 19:08) [1]
> У класса TThread есть специальное событие OnTerminate,
И так пробовал не работает :(
Defunct (2006-02-07 19:11:00) [26]оповещайте форму о завершении из потока с помощью PostMessage. В обработчике сообщения уменьшайте переменную thread_runnung.
Zeqfreed (2006-02-07 19:08:00) [27]У класса TThread есть специальное событие OnTerminate, возникающее после отработки метода Execute. А вообще, в приведенном коде, вроде нет ошибок.