Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.05.29;
Скачать: CL | DM;

Вниз

Повторный запуск рабочего потока   Найти похожие ветки 

 
dima_q   (2009-10-14 17:50) [0]

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

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();

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


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

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


 
DVM ©   (2009-10-14 17:58) [2]


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

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

TThread.OnTerminate;


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


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

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


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

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

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

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

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

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


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

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


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


> dima_q


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

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


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


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

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


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

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


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

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


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


> dima_q   (14.10.09 18:30) [8]

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

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


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


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

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


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


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


MsgWaitForMultipleObjects

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



Страницы: 1 вся ветка

Текущий архив: 2011.05.29;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.009 c
9-1189415446
Help me!
2007-09-10 13:10
2011.05.29
Есть какая-нибудь разница в способе создания MIPMAP?


15-1297718999
Юрий
2011-02-15 00:29
2011.05.29
С днем рождения ! 15 февраля 2011 вторник


1-1255528243
dima_q
2009-10-14 17:50
2011.05.29
Повторный запуск рабочего потока


3-1259431050
Lamer6666
2009-11-28 20:57
2011.05.29
В DBGridEh не вмещяются поля


2-1298064447
lewka
2011-02-19 00:27
2011.05.29
Копирование TImage