假如有三个对话框应用程序A、B、C,3个应用程序都是一启动就会产生一个线程,对应的线程为a、b、c。每个线程的执行时间会很长,用于计算的。
我想实现的:
1. 三个线程必须单个执行(互斥),也就是三个线程如果都启动后,只有最初准备的那个线程处于运行状态,其他的两个处于挂起状态。
2. 当第一个准备的线程运行结束之后,要通知第二个准备的线程,进入运行状态。(就是说是有顺序的,而不是通知第三个准备的线程)。
3. 同理,当第二个线程运行结束之后,要通知第三个准备的线程。
这样就能够让3个线程按先后准备顺序依次运行完毕。出去逛街了,回来就已经好了。我只知道用互斥体还有信号量可以实现,但是我不知道具体怎么实现。所以请大家说的时候,能写多详细就写多详细。 呵呵。
只要回答都会有分哦非常谢谢!
我想实现的:
1. 三个线程必须单个执行(互斥),也就是三个线程如果都启动后,只有最初准备的那个线程处于运行状态,其他的两个处于挂起状态。
2. 当第一个准备的线程运行结束之后,要通知第二个准备的线程,进入运行状态。(就是说是有顺序的,而不是通知第三个准备的线程)。
3. 同理,当第二个线程运行结束之后,要通知第三个准备的线程。
这样就能够让3个线程按先后准备顺序依次运行完毕。出去逛街了,回来就已经好了。我只知道用互斥体还有信号量可以实现,但是我不知道具体怎么实现。所以请大家说的时候,能写多详细就写多详细。 呵呵。
只要回答都会有分哦非常谢谢!
可以用互斥体啊。
当你a线程执行完后,把互斥体放掉,
到b线程。
在这当中可能会调用到c线程,所以你可以用(B)Sleep(1),(C)Sleep(2)来区分执行的顺序。
都是独立的在3个进程中运行,只要定义一个互诉对象,当线程a结束时候返回一个abandoned错误。通知进程b的b线程。要确定b运行,可以设置一个标志,比如定义enum{0ne, two, three},谁先准备谁先记录值。新手学习多线程中,还不懂进程见调用。以上浅见,误怪!
程序A、B启动初始(在创建各自线程a、b之前)利用CreateEvent创建有名的Event。同理,程序B、C启动初始 创建有名的Event2。
#include <iostream.h>DWORD WINAPI FunAProc(LPVOID lpParameter);
DWORD WINAPI FunBProc(LPVOID lpParameter);
DWORD WINAPI FunCProc(LPVOID lpParameter);HANDLE hMutex;
int main(void)
{
HANDLE hThreadA,hThreadB,hThreadC;
hThreadC = CreateThread(NULL,0,FunCProc,NULL,0,NULL);
hThreadB = CreateThread(NULL,0,FunBProc,NULL,0,NULL);
hThreadA = CreateThread(NULL,0,FunAProc,NULL,0,NULL);
CloseHandle(hThreadA);
CloseHandle(hThreadB);
CloseHandle(hThreadC);
//创建互斥对象
hMutex = CreateMutex(NULL,FALSE,NULL); Sleep(10000);
}
DWORD WINAPI FunAProc(LPVOID lpParameter)
{ while(1)
{
Sleep(10);
WaitForSingleObject(hMutex,INFINITE);
cout<<"线程A创建"<<endl;
ReleaseMutex(hMutex);
Sleep(1000);
}
return 0;
}DWORD WINAPI FunBProc(LPVOID lpParameter)
{ while(1)
{
Sleep(20);
WaitForSingleObject(hMutex,INFINITE);
cout<<"线程B创建"<<endl;
ReleaseMutex(hMutex);
Sleep(1000);
}
return 0;
}DWORD WINAPI FunCProc(LPVOID lpParameter)
{ while(1)
{
Sleep(30);
WaitForSingleObject(hMutex,INFINITE);
cout<<"线程C创建"<<endl;
ReleaseMutex(hMutex);
Sleep(1000);
}
return 0;
}
运行结果:
线程A创建
线程B创建
线程C创建.....依次循环
lpszFullPath, NULL, NULL, SW_SHOW );//此处有问题
if(nError<=32)
{
SHELLEXECUTEINFO sei;
ZeroMemory(&sei,sizeof(sei));
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.lpFile = lpszFullPath;//文件或者文件夹
sei.lpVerb = NULL;//NULL表示默认打开方法
sei.fMask = SEE_MASK_INVOKEIDLIST | SEE_MASK_FLAG_NO_UI;
ShellExecuteEx(&sei);//此处有问题
}
HANDLE tb;
HANDLE tc;DWORD WINAPI
ThreadRoutine(void* param)
{
char dbg[32];
switch(*(int*)param)
{
case 1000: lstrcpyA(dbg,"exit from thread A\r\n"); break;
case 2000: lstrcpyA(dbg,"exit from thread B\r\n"); break;
case 3000: lstrcpyA(dbg,"exit from thread C\r\n"); break;
} // do your own job here
Sleep(*(int*)param);
// finish
OutputDebugStringA(dbg);
return(0);
}int _tmain(int argc, _TCHAR* argv[])
{
int a=1000;
int b=2000;
int c=3000;
DWORD r;
ta=tb=tc=NULL;
ta=CreateThread(NULL,0,ThreadRoutine,(void*)&a,0,NULL);
r=WaitForSingleObject(ta,INFINITE);
if(WAIT_OBJECT_0==r)
{
tb=CreateThread(NULL,0,ThreadRoutine,(void*)&b,0,NULL);
r=WaitForSingleObject(tb,INFINITE);
if(WAIT_OBJECT_0==r)
{
tc=CreateThread(NULL,0,ThreadRoutine,(void*)&c,0,NULL);
r=WaitForSingleObject(tc,INFINITE);
}
}
return 0;
}