急问:多线程+管道……(解决完奉送家产200!)(0分)

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

SuperLunatic

Unregistered / Unconfirmed
GUEST, unregistred user!
用Delphi写了一个多线程的 Chile.exe :是画3个不同的图。
又写一个 Parent.exe:利用管道调用 Chile.exe !
我现在在Parent里建立了管道,子进程。请问我怎么从管道发消息,让子进程分别执行
一个一个线程(例如:一个按扭执行一个线程)。
var
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
SecurityAttributes: TSecurityAttributes;
ChildInput,MyOutput: THANDLE;
s:string;
Bytes: Cardinal;
Application.ProcessMessages;
SecurityAttributes.nLength := sizeof(SECURITY_ATTRIBUTES);
SecurityAttributes.lpSecurityDescriptor := nil;
SecurityAttributes.bInheritHandle := True;
// 建立管道
if not CreatePipe(ChildInput, MyOutput, @SecurityAttributes, 0) then
RaiseLastWin32Error;
FillChar(StartupInfo,SizeOf(StartupInfo),0);
with StartupInfodo
begin
cb := SizeOf(StartupInfo);
dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
wShowWindow := SW_Normal;
hStdInput := GetStdHandle(STD_INPUT_HANDLE);
hStdOutput := MyOutput;
hStdError := MyOutput;
end;

//创建子进程
If CreateProcess(nil,'child.exe',nil,nil,
True,0,nil,nil,StartupInfo,ProcessInfo) then
begin
CloseHandle(MyOutput);
repeat
ReadFile(ChildInput, s, 1, Bytes, nil);
until Bytes = 0;
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
End
else
ShowMessage('创建失败: '+
SysErrorMessage(GetLastError));
 
兄台,你的子进程是怎么写的,我原来在Unix下玩过,因为缓冲问题
没解决,很不好控制,经常造成child 等 Parent 或者 Parent 等 child
但是使用了FFlush 好像也不太可靠,你为什么要用管道呢,为什么不想用其他方法
如果你使用网络可以用Socket如果只在单机运行,你可以使用共享内存那,好好用
 
我也不想用,不过是被要求用。
用消息、共享内存、信号量、内存映象文件、COM
不过这次只能用管道,呵呵
 
如果你的子进程写了,请一起列出来看看,
你要让子进程做不同的事,可以用两种处理方式
1、子进程分工不同,那么需要主进程协调向管道里面发送的消息,
要让不同的子进程区分出来,到底是该谁工作,这样做最简单的做法是,为每一个子进程
分配一个管道句柄
2、子进程空闲时自己抢任务,你还需要一套事务机制。在子进程获取到任务时,要锁定
这个任务,并通知父进程删掉这个任务列表
具体情况,要看你的需求了,目前对你的要求了解不多,只能说到这里了,不过看兄台
的样子应该不是问管道API如何调用这种低级问题,哈哈
 
后退
顶部