刚刚学多线程,请高手指点 本帖最后由 ltsf1984 于 2010-10-08 14:58:14 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 使用类静态函数作为线程入口函数,并作强制类型转换LPTHREAD_START_ROUTINE 不好意思,发错了代码。以下是更正的:void CMultiThread1Dlg::OnBnClickedStart(){ // TODO: 在此添加控件通知处理程序代码 hThread=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CMultiThread1Dlg::ThreadFunc, //error NULL, 0, &ThreadID); GetDlgItem(IDC_START)->EnableWindow(FALSE); GetDlgItem(IDC_STOP)->EnableWindow(TRUE);} 确认CMultiThread1Dlg::ThreadFunc为静态函数。 刚在 MultiThread1Dlg.h改了,public: static void ThreadFunc();结果又有新错了, error LNK2019: 无法解析的外部符号 "protected: static void __cdecl CMultiThread1Dlg::ThreadFunc(void)" (?ThreadFunc@CMultiThread1Dlg@@KAXXZ),该符号在函数 "public: void __thiscall CMultiThread1Dlg::OnBnClickedStart(void)" (?OnBnClickedStart@CMultiThread1Dlg@@QAEXXZ) 中被引用 fatal error LNK1120: 1 个无法解析的外部命令 我记得如果用afxbeginthread进程参数为:LPVOID lpParameter,用强转为当前的CxxxDialog *就可以直接再线程中调用Dlg的内容了 static DWORD WINAPI ThreadProc(LPVOID lpParameter){ OutputDebugString(_T("ThreadProc\r\n")); return 0;}int nParam = 110;DWORD dwThreadID = 0;HANDLE hThread = CreateThread(NULL,0,ThreadProc,&nParam,0,&dwThreadID); 不是太明白,HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);你的意思是把第4个参数也改吗? lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。 DWORD WINAPI ThreadFuncsk(LPVOID lpParameter){ OutputDebugString(_T("ThreadProc\r\n")); return 0;}DWORD ThreadID;//线程ID;HANDLE hthread = CreateThread(NULL,0,ThreadFuncsk,0,0,&ThreadID); 注意返回类型就可以了:DWORD WINAPI //CMultiThread1Dlg.hclass CMultiThread1Dlg : public CDialog{protected: HANDLE hThread; DWORD ThreadID;public: void ThreadFunc(); afx_msg void OnBnClickedStart(); afx_msg void OnBnClickedStop();};//CMultiThread1Dlg.cppvoid CMultiThread1Dlg::OnBnClickedStart(){// TODO: 在此添加控件通知处理程序代码hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)CMultiThread1Dlg::ThreadFunc, //errorNULL,0,&ThreadID);error C2440: “类型转换”: 无法从“overloaded-function”转换为“LPTHREAD_START_ROUTINE” //CMultiThread1Dlg.hclass CMultiThread1Dlg : public CDialog{protected:HANDLE hThread;DWORD ThreadID;public:staic void ThreadFunc();afx_msg void OnBnClickedStart();afx_msg void OnBnClickedStop();};//CMultiThread1Dlg.cppvoid CMultiThread1Dlg::OnBnClickedStart(){// TODO: 在此添加控件通知处理程序代码hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)CMultiThread1Dlg::ThreadFunc, //errorNULL,0,&ThreadID); error LNK2019: 无法解析的外部符号 "protected: static void __cdecl CMultiThread1Dlg::ThreadFunc(void)" (?ThreadFunc@CMultiThread1Dlg@@KAXXZ),该符号在函数 "public: void __thiscall CMultiThread1Dlg::OnBnClickedStart(void)" (?OnBnClickedStart@CMultiThread1Dlg@@QAEXXZ) 中被引用 fatal error LNK1120: 1 个无法解析的外部命令 你的线线程函数不对, static void ThreadFunc(); 这个函数原型就不对, 线程函数必需有一个参数, 返回值. 就像10楼这位同学那样. 你看下LPTHREAD_START_ROUTINE的定义, 线程函数的原型要跟它的原型定义的一模一样! 还有调用约定,就是WINAPI这个宏定义,实际就是__stdcall 头文件中,修改如下public: static DWORD WINAPI ThreadFunc(LPVOID lpParam);cpp中,函数如下DWORD WINAPI CMultiThread1Dlg::ThreadFunc(LPVOID lpParam){ /* code... */ return 0;}调用处:DWORD ThreadID = 0;hThread=CreateThread(NULL, 0, ThreadFunc, NULL, 0, &ThreadID); static LRESULT myFunc(LPVOID pParam);//pParam可以将窗口的句柄或指针传递进来 void CCLJCnet1Dlg::OnBnClickedConnect(){ // TODO: 在此添加控件通知处理程序代码 /*if (mSckSender!=0) { closesocket(mSckSender); mSckSender=0; } if (mSckSender==0) { mSckSender=socket(AF_INET,SOCK_STREAM,0); ASSERT(mSckSender!=0); } SOCKADDR_IN m_addr; BOOL flag = TRUE; //int ret = setsockopt(mSckReceiver, SOL_SOCKET, SO_REUSEADDR, //(char *) &flag, sizeof(flag)); m_addr.sin_family = AF_INET; m_addr.sin_addr.s_addr = inet_addr("192.168.10.11"); //注意服务器端在 SERVER_UDP_PORT 10096 上接收数据,而在CLIENT_UDP_PORT //上发送数据,而客户端恰好相反 m_addr.sin_port = htons(3333); ret = bind(mSckReceiver, (struct sockaddr*) &m_addr, sizeof(m_addr)); //AfxMessageBox("网络已连接,等待传送数据");*/ SOCKET socketServer; SOCKADDR_IN sin; sockServer=socket(PF_INET,SOCK_STREAM,0); sin.sin_family=AF_INET; sin.sin_addr.s_addr=ulAddress; sin.sin_port=htons(4009); int nConnect=connect(sockServer, (LPSOCKADDR)&sin, sizeof(struct sockaddr)); CString str="16 16 02 01 03 22 00"; LPCTSTR p=str; int nCharSend=send(sockServer,(char*)&str,sizeof(str),0); if(nCharSend==SOCKET_ERROR) MessageBox("发送过程中发生一个错误!",NULL,MB_OK);} [code=C/C++][/codevoid CCLJCnet1Dlg::OnBnClickedConnect(){ // TODO: 在此添加控件通知处理程序代码 /*if (mSckSender!=0) { closesocket(mSckSender); mSckSender=0; } if (mSckSender==0) { mSckSender=socket(AF_INET,SOCK_STREAM,0); ASSERT(mSckSender!=0); } SOCKADDR_IN m_addr; BOOL flag = TRUE; //int ret = setsockopt(mSckReceiver, SOL_SOCKET, SO_REUSEADDR, //(char *) &flag, sizeof(flag)); m_addr.sin_family = AF_INET; m_addr.sin_addr.s_addr = inet_addr("192.168.10.11"); //注意服务器端在 SERVER_UDP_PORT 10096 上接收数据,而在CLIENT_UDP_PORT //上发送数据,而客户端恰好相反 m_addr.sin_port = htons(3333); ret = bind(mSckReceiver, (struct sockaddr*) &m_addr, sizeof(m_addr)); //AfxMessageBox("网络已连接,等待传送数据");*/ SOCKET socketServer; SOCKADDR_IN sin; sockServer=socket(PF_INET,SOCK_STREAM,0); sin.sin_family=AF_INET; sin.sin_addr.s_addr=ulAddress; sin.sin_port=htons(4009); int nConnect=connect(sockServer, (LPSOCKADDR)&sin, sizeof(struct sockaddr)); CString str="16 16 02 01 03 22 00"; LPCTSTR p=str; int nCharSend=send(sockServer,(char*)&str,sizeof(str),0); if(nCharSend==SOCKET_ERROR) MessageBox("发送过程中发生一个错误!",NULL,MB_OK);}] OpenGL 球形贴图 窟窿 小弟MFC小白,求解一个用MFC读txt文件的问题 估计和mtu有关 求教关于MSFlexGrid的问题 谨以此帖提醒一些盲目赚分的同行 + 散分(该散了:)) 很奇怪的一个问题!! 请问:谁有简单的画图代码??? 如何在Win下 修改并编译 OpenSSL ??? 这个代码为何出错?(只有一个语句) 真的不懂 通信命令编程问题,高手请进,在线等。 新手提问,BYTE数组的使用问题。
{
// TODO: 在此添加控件通知处理程序代码
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)CMultiThread1Dlg::ThreadFunc, //error
NULL,
0,
&ThreadID);
GetDlgItem(IDC_START)->EnableWindow(FALSE);
GetDlgItem(IDC_STOP)->EnableWindow(TRUE);
}
static void ThreadFunc();结果又有新错了, error LNK2019: 无法解析的外部符号 "protected: static void __cdecl CMultiThread1Dlg::ThreadFunc(void)" (?ThreadFunc@CMultiThread1Dlg@@KAXXZ),该符号在函数 "public: void __thiscall CMultiThread1Dlg::OnBnClickedStart(void)" (?OnBnClickedStart@CMultiThread1Dlg@@QAEXXZ) 中被引用
fatal error LNK1120: 1 个无法解析的外部命令
进程参数为:LPVOID lpParameter,用强转为当前的CxxxDialog *就可以直接再线程中调用Dlg的内容了
static DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
OutputDebugString(_T("ThreadProc\r\n"));
return 0;
}int nParam = 110;
DWORD dwThreadID = 0;
HANDLE hThread = CreateThread(NULL,0,ThreadProc,&nParam,0,&dwThreadID);
DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId);你的意思是把第4个参数也改吗?
DWORD WINAPI ThreadFuncsk(LPVOID lpParameter)
{
OutputDebugString(_T("ThreadProc\r\n"));
return 0;
}
DWORD ThreadID;//线程ID;
HANDLE hthread = CreateThread(NULL,0,ThreadFuncsk,0,0,&ThreadID);
DWORD WINAPI
class CMultiThread1Dlg : public CDialog
{
protected:
HANDLE hThread;
DWORD ThreadID;
public:
void ThreadFunc();
afx_msg void OnBnClickedStart();
afx_msg void OnBnClickedStop();
};//CMultiThread1Dlg.cpp
void CMultiThread1Dlg::OnBnClickedStart()
{
// TODO: 在此添加控件通知处理程序代码
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)CMultiThread1Dlg::ThreadFunc, //error
NULL,
0,
&ThreadID);error C2440: “类型转换”: 无法从“overloaded-function”转换为“LPTHREAD_START_ROUTINE”
class CMultiThread1Dlg : public CDialog
{
protected:
HANDLE hThread;
DWORD ThreadID;
public:
staic void ThreadFunc();
afx_msg void OnBnClickedStart();
afx_msg void OnBnClickedStop();
};//CMultiThread1Dlg.cpp
void CMultiThread1Dlg::OnBnClickedStart()
{
// TODO: 在此添加控件通知处理程序代码
hThread=CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)CMultiThread1Dlg::ThreadFunc, //error
NULL,
0,
&ThreadID);
error LNK2019: 无法解析的外部符号 "protected: static void __cdecl CMultiThread1Dlg::ThreadFunc(void)" (?ThreadFunc@CMultiThread1Dlg@@KAXXZ),该符号在函数 "public: void __thiscall CMultiThread1Dlg::OnBnClickedStart(void)" (?OnBnClickedStart@CMultiThread1Dlg@@QAEXXZ) 中被引用
fatal error LNK1120: 1 个无法解析的外部命令
你的线线程函数不对, static void ThreadFunc(); 这个函数原型就不对, 线程函数必需有一个参数, 返回值. 就像10楼这位同学那样. 你看下LPTHREAD_START_ROUTINE的定义, 线程函数的原型要跟它的原型定义的一模一样!
public:
static DWORD WINAPI ThreadFunc(LPVOID lpParam);cpp中,函数如下
DWORD WINAPI CMultiThread1Dlg::ThreadFunc(LPVOID lpParam)
{
/* code... */
return 0;
}调用处:
DWORD ThreadID = 0;
hThread=CreateThread(NULL, 0, ThreadFunc, NULL, 0, &ThreadID);
void CCLJCnet1Dlg::OnBnClickedConnect()
{
// TODO: 在此添加控件通知处理程序代码
/*if (mSckSender!=0)
{
closesocket(mSckSender);
mSckSender=0;
}
if (mSckSender==0)
{
mSckSender=socket(AF_INET,SOCK_STREAM,0);
ASSERT(mSckSender!=0);
}
SOCKADDR_IN m_addr;
BOOL flag = TRUE;
//int ret = setsockopt(mSckReceiver, SOL_SOCKET, SO_REUSEADDR,
//(char *) &flag, sizeof(flag));
m_addr.sin_family = AF_INET;
m_addr.sin_addr.s_addr = inet_addr("192.168.10.11");
//注意服务器端在 SERVER_UDP_PORT 10096 上接收数据,而在CLIENT_UDP_PORT
//上发送数据,而客户端恰好相反
m_addr.sin_port = htons(3333);
ret = bind(mSckReceiver, (struct sockaddr*) &m_addr, sizeof(m_addr));
//AfxMessageBox("网络已连接,等待传送数据");*/
SOCKET socketServer;
SOCKADDR_IN sin;
sockServer=socket(PF_INET,SOCK_STREAM,0);
sin.sin_family=AF_INET;
sin.sin_addr.s_addr=ulAddress;
sin.sin_port=htons(4009);
int nConnect=connect(sockServer, (LPSOCKADDR)&sin, sizeof(struct sockaddr)); CString str="16 16 02 01 03 22 00";
LPCTSTR p=str;
int nCharSend=send(sockServer,(char*)&str,sizeof(str),0);
if(nCharSend==SOCKET_ERROR)
MessageBox("发送过程中发生一个错误!",NULL,MB_OK);}
{
// TODO: 在此添加控件通知处理程序代码
/*if (mSckSender!=0)
{
closesocket(mSckSender);
mSckSender=0;
}
if (mSckSender==0)
{
mSckSender=socket(AF_INET,SOCK_STREAM,0);
ASSERT(mSckSender!=0);
}
SOCKADDR_IN m_addr;
BOOL flag = TRUE;
//int ret = setsockopt(mSckReceiver, SOL_SOCKET, SO_REUSEADDR,
//(char *) &flag, sizeof(flag));
m_addr.sin_family = AF_INET;
m_addr.sin_addr.s_addr = inet_addr("192.168.10.11");
//注意服务器端在 SERVER_UDP_PORT 10096 上接收数据,而在CLIENT_UDP_PORT
//上发送数据,而客户端恰好相反
m_addr.sin_port = htons(3333);
ret = bind(mSckReceiver, (struct sockaddr*) &m_addr, sizeof(m_addr));
//AfxMessageBox("网络已连接,等待传送数据");*/
SOCKET socketServer;
SOCKADDR_IN sin;
sockServer=socket(PF_INET,SOCK_STREAM,0);
sin.sin_family=AF_INET;
sin.sin_addr.s_addr=ulAddress;
sin.sin_port=htons(4009);
int nConnect=connect(sockServer, (LPSOCKADDR)&sin, sizeof(struct sockaddr)); CString str="16 16 02 01 03 22 00";
LPCTSTR p=str;
int nCharSend=send(sockServer,(char*)&str,sizeof(str),0);
if(nCharSend==SOCKET_ERROR)
MessageBox("发送过程中发生一个错误!",NULL,MB_OK);}]