假如有三个对话框应用程序A、B、C,3个应用程序都是一启动就会产生一个线程,对应的线程为a、b、c。每个线程的执行时间会很长,用于计算的。
我想实现的:
1. 三个线程必须单个执行(互斥),也就是三个线程如果都启动后,只有最初准备的那个线程处于运行状态,其他的两个处于挂起状态。
2. 当第一个准备的线程运行结束之后,要通知第二个准备的线程,进入运行状态。(就是说是有顺序的,而不是通知第三个准备的线程)。
3. 同理,当第二个线程运行结束之后,要通知第三个准备的线程。
这样就能够让3个线程按先后准备顺序依次运行完毕。出去逛街了,回来就已经好了。我只知道用互斥体还有信号量可以实现,但是我不知道具体怎么实现。所以请大家说的时候,能写多详细就写多详细。 呵呵。
只要回答都会有分哦非常谢谢!

解决方案 »

  1.   


    可以用互斥体啊。
    当你a线程执行完后,把互斥体放掉,
    到b线程。
    在这当中可能会调用到c线程,所以你可以用(B)Sleep(1),(C)Sleep(2)来区分执行的顺序。
      

  2.   

    如果有序运行比较复杂,建议利用一个DLL来控制。DLL中利用共享数据记录线程的次序和状态;通过调用DLL的导出函数来等待执行和结束执行,DLL中用命名互斥和命名事件实现同步。
      

  3.   

    感觉你的3个线程根本就没有冲突啊。
    都是独立的在3个进程中运行,只要定义一个互诉对象,当线程a结束时候返回一个abandoned错误。通知进程b的b线程。要确定b运行,可以设置一个标志,比如定义enum{0ne, two, three},谁先准备谁先记录值。新手学习多线程中,还不懂进程见调用。以上浅见,误怪!
      

  4.   

    总体:程序A、B 用一个有名Event,初始为无信号,线程a执行完将该event设为有信号。 线程b 利用WaitForSingleObject等待该event,等到有信号就开始执行      程序B、C 用一个有名Event2,初始为无信号,线程b执行完将event2设为有信号。线程c 利用WaitForSingleObject等待event2,等到有信号就开始执行
    程序A、B启动初始(在创建各自线程a、b之前)利用CreateEvent创建有名的Event。同理,程序B、C启动初始 创建有名的Event2。
      

  5.   

    不知道具体要干什么。简单点不行吗?程序A结束时启动B,B结束时启动C。不就得了?
      

  6.   

    楼上的,你说的意思非常对,就是程序A结束时启动B,B结束时启动C,但是我是想知道代码要怎么写啊?具体在哪个位置加什么?
      

  7.   

    给你贴一个控制台的例子#include <windows.h>
    #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创建.....依次循环
      

  8.   

    用ShellExecuteEx函数,可以运行可执行文件。 DWORD nError=(DWORD)ShellExecute(NULL, "open", 
    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);//此处有问题
    }
      

  9.   

    #include <windows.h>HANDLE ta;
    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;
    }