首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

请教以上多线程代码错在那里 VS2008+MFC宽字节+系统WIN 732位

2012-08-30 
请问以下多线程代码错在那里 VS2008+MFC宽字节+系统WIN 732位C/C++ codebukDlg.cpp//这个消息响应函数BEGI

请问以下多线程代码错在那里 VS2008+MFC宽字节+系统WIN 732位

C/C++ code
bukDlg.cpp//这个消息响应函数BEGIN_MESSAGE_MAP(CbukDlg, CDialog)    ON_WM_SYSCOMMAND()    ON_WM_PAINT()    ON_WM_QUERYDRAGICON()    //}}AFX_MSG_MAP    ON_MESSAGE(WM_RECVDATA,&OnRecvData)//这个是我添加的消息函数END_MESSAGE_MAP()void bukDlg::OnBnClickedStart1()   //2个区{    // TODO: 在此添加控件通知处理程序代码    RECBPARAM *pRecv = new RECBPARAM;    pRecv->hwnd = m_hWnd;    hThread1 = CreateThread(NULL,0,Rproc1,(LPVOID)pRecv,0,NULL);    CloseHandle(hThread1);//关闭多线程句柄}DWORD WINAPI bukDlg::Rproc1(LPVOID lpParameter){    HWND hwnd = ((RECBPARAM*)lpParameter)->hwnd;    wchar_t ch1[300]; for (int i=0; i<10000; i++) {    swprintf_s(ch1,300,L"%S\n",_T("fyfhfghfghf"));    ::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)ch1); }return 0;}LRESULT bukDlg::OnRecvData(WPARAM wParam,LPARAM lParam){    CString str = (wchar_t *)lParam;    CString strTemp;    GetDlgItemText(IDC_EDIT1,strTemp);    str+="\r\n";    str+=strTemp;    SetDlgItemText(IDC_EDIT1,str);    return TRUE;}bukDlg.h//定义#define WM_RECVDATA WM_USER+1//构造体指针struct RECBPARAM{    HWND hwnd;};//自己定义的权限设置为公有public:    static DWORD WINAPI Rproc(LPVOID lpParameter);     //   线程    static DWORD WINAPI Rproc1(LPVOID lpParameter);    //   线程protected:    HANDLE hThread;     // 定义一个线程句柄    HANDLE hThread1;    // 定义一个线程句柄1protected:    HICON m_hIcon;    // 生成的消息映射函数    virtual BOOL OnInitDialog();    afx_msg LRESULT OnRecvData(WPARAM wParam,LPARAM lParam); //自定定义的消息映射    DECLARE_MESSAGE_MAP()


以上是代码 请大家看下,到底是那里错误了

[解决办法]
hThread1 = CreateThread(NULL,0,Rproc1,(LPVOID)pRecv,0,NULL);
//注释这句
//CloseHandle(hThread1);//关闭多线程句柄

::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)ch1);
改为
SendMessage(...)
[解决办法]
post消息可能还没有执行,你的参数已经被更改了,用send可以同步执行。

[解决办法]
wchar_t ch1[300];
变量的生存期过了
[解决办法]
1. ch1 用指针传递,接受到使用接受就删除指针

2. 保存到集合(比如 list),然后多线程做同步(比如CCriticalSection)读写结点(比如 pop push)
[解决办法]
wchar_t ch1[300];
改为 wchar_t *ch1 = new wchar_t[300];
在LRESULT bukDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
delete

热点排行