![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Повторный запуск рабочего потока [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]Чтобы Вы правильно меня поняли, немного перефразирую вопрос. Как ожидать завершения работы потока, без замораживания интерфейса, и с выполнением некоторого кода, после завершения рабочего потока, не выделяя его в процедуру?