Форум: "Основная";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];
ВнизПроблема WaitForSingleObject в отдельном потоке Найти похожие ветки
← →
Вован_ (2004-02-16 15:41) [0]Уважаемые мастера! В моей проге в отдельном потоке надо запускать внешнее приложение и ждать, когда оно закончит свою работу. Для этого я использовал следующий код, который выполняется в паралельном потоке:
var
si: TStartupInfo;
p: TProcessInformation;
begin
if <условие> then begin
FillChar(si,SizeOf(si),0);
with si do begin
cb:=SizeOf(si);
dwFlags:=startf_UseShowWindow;
wShowWindow:=SW_MAXIMIZE;
end;
CreateProcess(nil,PChar(Edit1.Text),nil,nil,False,
Create_default_error_mode,nil,nil,si,p);
WaitForSingleObject(p.hProcess,Infinite);
end else <выполняется что-то другое>;
end;
Так вот, когда "выполняется что-то другое", паралельный поток работает нормально и в это же время можно делать что-либо в основном потоке. А когда требуется подождать завершения выполения внешнего приложения - зависает вся прога, т.е. и основной поток приложения.
В чем тут дело? Как избавиться от зависания основного потока приложения?
← →
MBo (2004-02-16 16:09) [1]> зависает вся прога, т.е. и основной поток приложения.
Значит, у тебя неверно построена синхронизация
← →
Семен Сорокин (2004-02-16 16:10) [2]Вован_ (16.02.04 15:41)
покажи как ты этот кусок в потоке используешь.
меня смущает вот это:
CreateProcess(nil,PChar( Edit1.Text),nil,nil,False,
Create_default_error_mode,nil,nil,si,p);
← →
Digitman (2004-02-16 16:19) [3]
> зависает вся прога
и как это выглядит ? визуально ?
← →
Вован_ (2004-02-16 16:19) [4]В основном потоке выполняется команда:
Thread1.DoWork;
Поток Thread1 в юните UTA сделал следующим образом:
unit UTA;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
MyThread = class(TThread)
private
{private declarations}
protected
procedure Execute; override;
public
procedure DoWork;
end;
var
Thread1: MyThread;
implementation
uses UMainForm;
procedure MyThread.Execute;
begin
if not Terminated then Synchronize(DoWork);
end;
procedure MyThread.DoWork;
var
si: TStartupInfo;
p: TProcessInformation;
begin
FillChar(si,SizeOf(si),0);
with si do begin
cb:=SizeOf(si);
dwFlags:=startf_UseShowWindow;
wShowWindow:=SW_MAXIMIZE;
end;
CreateProcess(nil,PChar(MainForm.Edit2.Text),nil,nil,False,
Create_default_error_mode,nil,nil,si,p);
WaitForSingleObject(p.hProcess,Infinite);
end;
end.
Да, название внешнего приложения для процедуры CreateProcess берется из другой формы - MainForm, но это же не повод всё приложение вешать:)
← →
Вован_ (2004-02-16 16:24) [5]2 Digitman
Визуально это выглядит следующим образом. Главная форма приложения в рантайме дает возможность динамически настраивать некоторые характеристики приложения, которое должно себе время от времени выполняться в параллельном потоке, чтобы не мешать юзеру делать на главной форме в это же время что-то другое.
Так вот, когда внешнее приложение в Thread1 выполняется, на внешней форме ничего сделать нельзя - прога как-бы зависает до окончания работы Thread1.
← →
Guest (2004-02-16 16:24) [6]Synchronize(DoWork) означает, что DoWork выполняется в контексте главного потока. Поэтому именно он ждет и "виснет"
← →
Вован_ (2004-02-16 16:28) [7]Guest (16.02.04 16:24) [6]
Если просто сделать if not Terminated then DoWork;
тогда то же самое :(
← →
Guest (2004-02-16 16:32) [8][7] Вован_ (16.02.04 16:28)
Пробовали или так думаете? :)
В основном потоке нет какой-либо синхронизации?
← →
Семен Сорокин (2004-02-16 16:33) [9]2Вован_
передавай MainForm.Edit2.Text в качестве параметра своему потоку, и обработку веди в теле процедуры Execute без Synhronize и все у тебя получится.
← →
Digitman (2004-02-16 17:13) [10]Вован, ты сдув один-в-один из статьи Кариха вот это
procedure MyThread.Execute;
begin
if not Terminated then Synchronize(DoWork);
end;
думал ли хоть чуть-чуть, что. почему и зачем здесь происходит ?
← →
Бином Ньютоныч (2004-02-16 18:37) [11]>В основном потоке выполняется команда:
>Thread1.DoWork;
Это круто
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.099 c