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

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

Повторный запуск рабочего потока [D7, WinXP]


dima_q ©   (2009-10-14 17:50:00) 

Всем привет!
У меня есть некоторыя вопрос по теме потоков:
Допустим у нас есть поток:

TMyThread = class(TThread)
 procedure Execute(); override;
end;
...
procedure TMyThread.Execute;
begin
 while (not Terminated) do
 begin            
   try  
     чего-то делаем...          
   finally
     Suspend();
   end;    
 end;
end;


Запускаем поток и ожидаем окончания его работы без подвиса интерфейса(выделить действие после окончания в другую процедуру не подходит ввиду существенного объема переделок, написано уже много кода):

Resume();
while (not Self.Suspended) do
 Application.HandleMessage();

Так вот сам вопрос. Чтобы предотвратить повторного запускания потока, можно вставить подобный цикл в код, который может запустить данный поток. Т.е. он будет проверять, работает ли поток, и если он работает не запускать снова. Но, после запуска второго цикла обработки петли сообщений, первый останавливается, и код после завершения потока, запущенного первый раз, выполнится только после того, как выполнится второй запуск потока, и выход из него. Я прав? Если да, то как с этим боротся?


Сергей М.   (2009-10-15 20:48:00) [1]


> Как ожидать завершения работы потока, без замораживания
> интерфейса


MsgWaitForMultipleObjects

Хотя при такой формулировке и понимании она что мертвому припарка.


dima_q   (2009-10-14 19:05:00) [2]


> У тебя немного неверный подход. Ты лучше бы сразу перешел
> на асинхронную модель.Если ты хочешь использовать один и
> тот же поток для выполнения серии долгих операций, создай
> своего рода потокобезопасную очередь в которую помещай задания
> на выполнение. Задания будут выполнятся по мере поступления,
>  остальное время поток будет спать и ждать заданий. После
> выполнения очередного задания поток может уведомлять основной
> поток о том, что задание выполнено. Как то так.

Вобщем, спасибо за ответы, я в принципе идею понял, буду пытаться реализовывать.


Медвежонок Пятачок   (2009-10-14 19:02:00) [3]

самодельный поток здесь не нужен.
адо само умеет асинхронно работать


DVM   (2009-10-14 19:02:00) [4]


> dima_q   (14.10.09 18:30) [8]

У тебя немного неверный подход. Ты лучше бы сразу перешел на асинхронную модель.

Если ты хочешь использовать один и тот же поток для выполнения серии долгих операций, создай своего рода потокобезопасную очередь в которую помещай задания на выполнение. Задания будут выполнятся по мере поступления, остальное время поток будет спать и ждать заданий. После выполнения очередного задания поток может уведомлять основной поток о том, что задание выполнено. Как то так.


dima_q   (2009-10-14 18:30:00) [5]

Поток, чтоб не заморозить интерфейс разрешить выполнение других функций. В потоке идет обращение к базе через ADO, что может надолго убить программу.


DVM   (2009-10-14 18:18:00) [6]


> И при запуске потока мы делаем так:
>
> WaitForExecution();
> Resume();
> WaitForExecution();
> работа после выполнения кода в потоке...

На кой леший тут поток, если мы его все равно ждем а?


DVM   (2009-10-14 18:15:00) [7]


> dima_q


> Т.е. я хочу в свою программу поток, который можно запустить
> на выполнение некоторых действий внутри кода, подождать,
>  выполнить другие действия, и чтоб если в момент работы
> потока, код содержащий его запуск, выполнится еще раз, он
> ожидал пока завершится поток, и код после его завершения.
>
>

Я не понял, объясни по другому.


dima_q   (2009-10-14 18:08:00) [8]

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


dima_q   (2009-10-14 18:05:00) [9]

Есть у нас функция:

function TMyThread.WaitForExecution()
begin
 while (not Self.Suspended) do
   Application.HandleMessage();
end;

И при запуске потока мы делаем так:

WaitForExecution();
Resume();
WaitForExecution();
работа после выполнения кода в потоке...

Так вот после второго запуска мы теряем "работа после выполнения кода в потоке..." от первого запуска данного кода.


dima_q   (2009-10-14 18:02:00) [10]


> Это уже не ожидание получается, а просто узнать требуется,
>  что поток завершился.TThread.OnTerminate;

Нет, я немного не это имел ввиду, ожидать окончания работы потока, т.е. до момента его Suspend(), а не завершения. Он многоразовый, перезарежаем его и опять Resume.


DVM   (2009-10-14 17:58:00) [11]


> Как ожидать завершения работы потока, без замораживания
> интерфейса, и с выполнением некоторого кода

Это уже не ожидание получается, а просто узнать требуется, что поток завершился.

TThread.OnTerminate;


dima_q   (2009-10-14 17:54:00) [12]

Чтобы Вы правильно меня поняли, немного перефразирую вопрос. Как ожидать завершения работы потока, без замораживания интерфейса, и с выполнением некоторого кода, после завершения рабочего потока, не выделяя его в процедуру?


Наверх

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