Текущий архив: 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