谁能给出使用线程调用外部程序的例子,谢谢!(100分)

  • 主题发起人 主题发起人 s111
  • 开始时间 开始时间
S

s111

Unregistered / Unconfirmed
GUEST, unregistred user!
自己写的总是出现 EAccessViolation的错误,又找不出来究竟在哪里,
大家谁有空帮忙写一个,如果能用立即给分!
 
先引用外部单元再引用程序
 
不如把你的代码贴出来帮你看.或者你再另做一个可以单独贴出来的程序.
 
给你一段代码
这是线程的
procedure TClientDataThread.Execute;
begin
Synchronize(synchAddDataToControl);
end;

procedure TClientDataThread.synchAddDataToControl;
begin
TargetList.AddStrings(ListBuffer);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
end;
***********************************************
出发的
procedure TForm1.TcpServer1Accept(sender: TObject;
ClientSocket: TCustomIpClient);
var
s: string;
DataThread: TClientDataThread;
begin
// create thread
DataThread:= TClientDataThread.Create(true);
// set the TagetList to the gui list that you
// with to synch with.
DataThread.TargetList := memRecv.lines;
// Load the Threads ListBuffer
DataThread.ListBuffer.Add('*** Connection Accepted ***');
DataThread.ListBuffer.Add('Remote Host: ' + ClientSocket.LookupHostName(ClientSocket.RemoteHost) +
' (' + ClientSocket.RemoteHost + ')');
DataThread.ListBuffer.Add('===== begin
message =====');
s := ClientSocket.Receiveln;
while s <> ''do
begin
DataThread.ListBuffer.Add(s);
s := ClientSocket.Receiveln;
end;
DataThread.ListBuffer.Add('===== End of message =====');
// Call Resume which will execute and synch the
// ListBuffer with the TargetList
DataThread.Resume;
^^^^^^^^^^^^^^^^^^^^^^
end;

这是调用的
 
虚心实腹老大给的好难阿,菜鸟看不懂
我的代码如下。还有运行过以后需要释放线程,不然没有办法第二次调用。
---------------------------------
主线程:
Procedure TForm1.IntegratClick(Sender: TObject);
Const
Prog = 'Pre.exe';
ProgEnd = 'The termination of Pre.';
Var
ExitCode : Dword;
FileName,Result : String;
Restr : TStrings;
begin
ExitCode := 0;
FileName := XmPath + XmName;
CommandProg := Prog;
CommandPara := FileName;
Dir := XmPath;
RunThread := TRunThread.Create(True);
RunThread.FreeOnTerminate := True;
RunThread.Resume;
end;

-------------------------------
调用线程:
procedure TRunThread.Execute;
begin
If (Terminated) then
begin
showmessage('Program has exited.');
exit;
end;
RunDos();
end;

procedure TRunThread.RunDOS();
var
Cmdprog,Cmdpara,Dr:string;
execpara: String;
begin
CmdProg := Form1.CommandProg;
CmdPara := Form1.CommandPara;
dr := Form1.Dir;
execpara := 'E:/xm/pre.exe ' + CmdPara;
while not terminateddo
begin
IF ((CmdProg<>'')and(CmdPara<>'')) then
begin
winexec(Pchar(execpara), SW_HIDE );
// shellexecute(form1.handle,'open','E:/xm/pre.exe',PChar(CmdPara),nil,SW_HIDE);
//用createProcess也会出错的
end
else

begin
IF (CmdProg = '') then
ShowMessage('Nothing in Prog');
IF (CmdPara = '') then
ShowMessage('Nothing in Para');
Exit;
end;

end;
end;
 
拜托,你这样用线程有什么用啊? winexec ,shellexecute, createprocess都不会怎么占用你的程序主线程的运行时间,你为什么还用线程啊? 你需要等待被执行程序结束? 还是需要知道被执行程序何时结束?
如果是需要等待或结束通知,那么才有点意义,不过你的调用代码就不对了.
问题太多,思路啥的都不说,你到底想写什么东西,实在看不出来.
 
先谢谢shangshang耐心的看我的代码。
慢慢说:
1.我有一个控制台程序,从Linux下移植到Windows下的,用于科学计算。
使用命令行“Pre a.txt”可以运行,程序非常占用内存、CUP。
  
2.现在为程序写了个界面Form1,但是如果计算量太大,界面调用程序时就没有响应,
程序无法正常结束。
3.有人建议“把调用程序的部分放到线程中去”。
我需要知道被执行程序何时结束,然后释放线程,继续新的计算。
不知道说清楚没有
 
明白你的意思,你是希望在线程中调用外部程序pre(免的阻塞主窗体界面响应),并等待pre运行完毕退出后,此线程通知主线程再做别的运算.
如果我说的对的话,连系我的Msn: ypv9@hotmail.com
这样来回说话太费劲,如果我理解的正确,那么就很容易解决.
 
接受答案了.
 
后退
顶部