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

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

Вопрос по потокам. [D7, XP]


Страницы:   1 2

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. А вообще, в приведенном коде, вроде нет ошибок.


Страницы:   1 2

Наверх

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