两个程序需要同步运行:(A、B在同一台机器上,网络连接)
A发给B数据,B被激活,占用大量CPU进行运算。运算后B把运算结果发送给A,进入空闲等待。A继续运行,从缓冲区读取数据。A在发送数据后并不等待,但是B的运行会暂停A的运行。虽然原则上不太稳定,但是运行效果一直还不错。
后来用了超线程CPU,A运行过快,收不到B运算的结果。我郁闷惨了,我只有B的代码,只能修改B。所以我想,能不能用某种办法暂停A的执行?或者有什么别的方法让我的B占有全部CPU也可以。请高手一定帮忙!感激不尽!
A发给B数据,B被激活,占用大量CPU进行运算。运算后B把运算结果发送给A,进入空闲等待。A继续运行,从缓冲区读取数据。A在发送数据后并不等待,但是B的运行会暂停A的运行。虽然原则上不太稳定,但是运行效果一直还不错。
后来用了超线程CPU,A运行过快,收不到B运算的结果。我郁闷惨了,我只有B的代码,只能修改B。所以我想,能不能用某种办法暂停A的执行?或者有什么别的方法让我的B占有全部CPU也可以。请高手一定帮忙!感激不尽!
解决方案 »
- stdafx.cpp单独编译后,项目编译不能通过
- 可视化ActiveX中,外部截获单击控件事件
- MFC 多文档 关闭程序时‘蹦’的一声,大家帮忙看下。
- 用socket 得到网页.recv 怎么没反应.估计是http头,不对.谁给看下.
- 关于指针转换的问题
- 软件延时
- 木头在此拿分了
- 请教。。。。C程序的问题,值的传递。。。。。
- 请问哪里可以得到从Cwnd派生来的类的源代码,例如:Cbutton?
- 如何播放一个在内存中的wav文件?
- 问题:'pcap_next_ex' : undeclared identifier
- 请教:我在SQL2000中表temp有一个长度为8的nvarchar字段.但当我在里面存20040715后,使用GetFieldValue去读,仅能得到2004071,为何?
{
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;
}
都需要Include什么东西?
我始终找不到OpenThread的定义啊。
其他进线程函数也一样。