|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
BOOL CChatDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 设置此对话框的图标。 当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
InitSocket();
RECVPARAM *pRevcParam = new RECVPARAM;
pRevcParam->socket = m_Socket;
pRevcParam->hwnd = m_hWnd;
HANDLE hThread = CreateThread(NULL, 0, RecvProc, (LPVOID)pRevcParam, 0, NULL);
CloseHandle(hThread);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
DWORD WINAPI CChatDlg::RecvProc(LPVOID lpParameter)
{
SOCKET socket = ((RECVPARAM*)lpParameter)->socket;
HWND hwnd = ((RECVPARAM*)lpParameter)->hwnd;
SOCKADDR_IN addrFrom;
int len = sizeof(SOCKADDR);
char recvBuf[200];
char tempBuf[300];
int retVal;
while (TRUE)
{
retVal = recvfrom(socket, recvBuf, 200, 0, (SOCKADDR*)&addrFrom, &len); //运行不下去了
if (SOCKET_ERROR == retVal)
{
break;
}
sprintf(tempBuf, "%s说:%s", inet_ntoa(addrFrom.sin_addr), recvBuf);
::PostMessage(hwnd, WM_RECVDATA, 0, (LPARAM)tempBuf);
}
return 0;
}
了解您的问题。如果在运行时代码直接跳出,并且没有执行RecvProc函数的循环,那么可能的原因是在CreateThread创建线程时发生了问题。在这种情况下,我们需要检查CreateThread的返回值以获取更多信息。
以下是如何检查CreateThread的返回值:
- HANDLE hThread = CreateThread(NULL, 0, RecvProc, (LPVOID)pRevcParam, 0, NULL);
- if (hThread == NULL) {
- DWORD dwError = GetLastError();
- // 这里可以输出或记录错误码,以便进一步分析
- } else {
- CloseHandle(hThread);
- }
复制代码
如果CreateThread返回NULL,那么代表线程创建失败。您可以检查GetLastError()函数的返回值以获取更多关于失败原因的信息。
另外,您也可以尝试使用C++标准库中的std::thread来替换CreateThread。这将使代码更具可移植性,并减少与Win32 API相关的潜在问题。以下是使用std::thread的示例:
- #include <thread>
- // ...其他代码...
- void CChatDlg::RecvProc(RECVPARAM* pRevcParam) {
- // ...和原来的RecvProc函数一样...
- }
- // ...其他代码...
- BOOL CChatDlg::OnInitDialog() {
- // ...其他初始化代码...
- std::thread recvThread(&CChatDlg::RecvProc, this, pRevcParam);
- recvThread.detach(); // 与主线程分离,允许子线程独立运行
- return TRUE;
- }
复制代码
请注意,使用std::thread可能需要对代码进行一些调整,例如将RecvProc的签名从DWORD WINAPI RecvProc(LPVOID)更改为void RecvProc(RECVPARAM*)。
如果这些建议仍无法解决问题,请提供更多的代码和上下文,以便我能更好地理解您的问题。
|
|