两个程序需要同步运行:(A、B在同一台机器上,网络连接)
A发给B数据,B被激活,占用大量CPU进行运算。运算后B把运算结果发送给A,进入空闲等待。A继续运行,从缓冲区读取数据。A在发送数据后并不等待,但是B的运行会暂停A的运行。虽然原则上不太稳定,但是运行效果一直还不错。
后来用了超线程CPU,A运行过快,收不到B运算的结果。我郁闷惨了,我只有B的代码,只能修改B。所以我想,能不能用某种办法暂停A的执行?或者有什么别的方法让我的B占有全部CPU也可以。请高手一定帮忙!感激不尽!

解决方案 »

  1.   

    刚才看了些资料,发现SuspendThread可疑暂停线程。但是我还是不知道如何获得线程的句柄,我只能找到A程序主窗口的句柄。下一步怎么办?
      

  2.   

    BOOL SuspendProcess(DWORD dwProcessID)//挂起程序,必须知道进程得PID
    {
    BOOL           bResult = TRUE;
    HANDLE         hThread;
    HANDLE         hSnapshot;
        THREADENTRY32  ThreadEntry32;
        BOOL           bExist;//    OpenThread = (HANDLE(__stdcall *)(DWORD,BOOL,DWORD))GetProcAddress(GetModuleHandle("kernel32"),"OpenThread");
    if(OpenThread == NULL)
    {
    printf("GetProcAddress Error: %d\n",GetLastError());
    bResult = FALSE; 
    return FALSE;
    } DebugPrivilege(TRUE);
    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,dwProcessID);
    if(hSnapshot != INVALID_HANDLE_VALUE)
    {
    ThreadEntry32.dwSize = sizeof(THREADENTRY32);          
    bExist = Thread32First(hSnapshot,&ThreadEntry32);
    while(bExist = Thread32Next(hSnapshot,&ThreadEntry32))
    {
    if(ThreadEntry32.th32OwnerProcessID == dwProcessID)
    {
    hThread = OpenThread(THREAD_SUSPEND_RESUME,FALSE,ThreadEntry32.th32ThreadID);
    if(hThread != NULL)
    {
    SuspendThread(hThread);
           CloseHandle(hThread);
    }
    else
    {
    CloseHandle(hSnapshot);
    bResult = FALSE;
    }
    }
    }
    }
    else
    {
    bResult = FALSE;
    }
    CloseHandle(hSnapshot);
    DebugPrivilege(FALSE); if(bResult == TRUE)
    {
    printf("Suspend Process %d Success !\n",dwProcessID);
    } return bResult;
    }BOOL ResumeProcess(DWORD dwProcessID)//继续运行,也要知道PID
    {
    BOOL           bResult = FALSE;
    HANDLE         hThread;
    HANDLE         hSnapshot;
        THREADENTRY32  ThreadEntry32;
        BOOL           bExist;
        
    //    OpenThread = (HANDLE(__stdcall *)(DWORD,BOOL,DWORD))GetProcAddress(GetModuleHandle("kernel32"),"OpenThread");
    if(OpenThread == NULL)
    {
    printf("GetProcAddress Error: %d\n",GetLastError());
    return FALSE;
    } DebugPrivilege(TRUE);
    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,dwProcessID);
    if(hSnapshot != INVALID_HANDLE_VALUE)
    {
    ThreadEntry32.dwSize = sizeof(THREADENTRY32);          
    bExist = Thread32First(hSnapshot,&ThreadEntry32);
    while(bExist = Thread32Next(hSnapshot,&ThreadEntry32))
    {
    if(ThreadEntry32.th32OwnerProcessID == dwProcessID)
    {
    hThread = OpenThread(THREAD_SUSPEND_RESUME,FALSE,ThreadEntry32.th32ThreadID);
    if(hThread != NULL)
    {
    ResumeThread(hThread);
           CloseHandle(hThread);
    bResult = TRUE;
    }
    else
    {
    CloseHandle(hSnapshot);
    }
    }
    }
    } CloseHandle(hSnapshot);
    DebugPrivilege(FALSE); if(bResult == TRUE)
    {
    printf("Resume Process %d Success !\n",dwProcessID);
    }
    else
    {
    printf("Resume Process %d Failure !\n",dwProcessID);
    } return bResult;
    }里面用到了提取权限得函数如下:
    BOOL DebugPrivilege(BOOL bEnable)
    {
    BOOL              bResult = TRUE;
    HANDLE            hToken;
    TOKEN_PRIVILEGES  TokenPrivileges; if(OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,&hToken) == 0)
    {
    printf("OpenProcessToken Error: %d\n",GetLastError());
    bResult = FALSE;
    }
    TokenPrivileges.PrivilegeCount           = 1;
    TokenPrivileges.Privileges[0].Attributes = bEnable ? SE_PRIVILEGE_ENABLED : 0;
    LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&TokenPrivileges.Privileges[0].Luid);
    AdjustTokenPrivileges(hToken,FALSE,&TokenPrivileges,sizeof(TOKEN_PRIVILEGES),NULL,NULL);
        if(GetLastError() != ERROR_SUCCESS)
    {
    bResult = FALSE;
    }
    CloseHandle(hToken);
        
    return bResult;
    }
      

  3.   

    VC 6下需要SDK,否则编译时告知SUSPAND未定义!
      

  4.   

    还是不会~~~麻烦再指点指点!
    都需要Include什么东西?
    我始终找不到OpenThread的定义啊。
      

  5.   

    啊。知道了。OpenThread可以用了。能编译了。我再试试。
      

  6.   

    晕~没基础啊?先找到目标进程,然后OpenProcess,然后用OpenThread打开其主线程,然后用SuspendThread暂停该线程,用这样的调用序列就可以了,上面的pepsi1980(这只老鼠不会游泳)用的就是这个次序。OpenThread定义在Windows.h里面,需要包含Lib库Kernel32.lib。
    其他进线程函数也一样。
      

  7.   

    找到进程,然后找到每个线程,对每个线程Suspend