当前位置:主页>销售管理软件> 列表

谁能给出使用线程调用外部程序的例子,谢谢! 找速达3000进销存

库存管理软件版1楼: 自己写的总是出现 EAccessViolation的错误,又找不出来究竟在哪里,
大家谁有空帮忙写一个,如果能用立即给分!

2楼: 先引用外部单元再引用程序 如速达3000进销存

3楼: 不如把你的代码贴出来帮你看.或者你再另做一个可以单独贴出来的程序.

4楼: 给你一段代码
这是线程的
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;

这是调用的

5楼: 虚心实腹老大给的好难阿,菜鸟看不懂
我的代码如下。还有运行过以后需要释放线程,不然没有办法第二次调用。
---------------------------------
主线程:
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 terminated do
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;

6楼: 拜托,你这样用线程有什么用啊? winexec ,shellexecute, createprocess都不会怎么占用你的程序主线程的运行时间,你为什么还用线程啊? 你需要等待被执行程序结束? 还是需要知道被执行程序何时结束?
如果是需要等待或结束通知,那么才有点意义,不过你的调用代码就不对了.
问题太多,思路啥的都不说,你到底想写什么东西,实在看不出来.

库存管理软件版7楼: 先谢谢shangshang耐心的看我的代码。
慢慢说:
1.我有一个控制台程序,从Linux下移植到Windows下的,用于科学计算。
使用命令行“Pre a.txt”可以运行,程序非常占用内存、CUP。
  
2.现在为程序写了个界面Form1,但是如果计算量太大,界面调用程序时就没有响应,
程序无法正常结束。

3.有人建议“把调用程序的部分放到线程中去”。
我需要知道被执行程序何时结束,然后释放线程,继续新的计算。

不知道说清楚没有

8楼: 明白你的意思,你是希望在线程中调用外部程序pre(免的阻塞主窗体界面响应),并等待pre运行完毕退出后,此线程通知主线程再做别的运算.
如果我说的对的话,连系我的Msn: ypv9@hotmail.com
这样来回说话太费劲,如果我理解的正确,那么就很容易解决.

9楼: 接受答案了.