| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 652 人关注过本帖
标题:有关线程问题 请教下啊 搞好久了
只看楼主 加入收藏
linkang1024
Rank: 2
等 级:论坛游民
帖 子:90
专家分:83
注 册:2011-10-10
结帖率:70.83%
收藏
已结贴  问题点数:20 回复次数:4 
有关线程问题 请教下啊 搞好久了
private:
    DWORD WINAPI GetCom(LPVOID lpParameter);
初始化
BOOL CConfigPort::OnInitDialog()
{
    CDialog::OnInitDialog();
    HANDLE hThread=CreateThread(NULL, 0, GetCom, NULL, 0, NULL);
    CloseHandle(hThread);

}
函数实现
DWORD WINAPI CConfigPort::GetCom(LPVOID lpParameter)
{
    HANDLE  hCom;
    int i,num,k,j;
    CString str;
    BOOL flag;
    const int Comb[3] = {IDC_COMBO1, IDC_COMBO2, IDC_COMBO3};
    cnComm *mComAll[3] = {&mCom1, &mCom2, &mCom3};
    for(j=0; j<3; j++)
        ((CComboBox *)GetDlgItem(Comb[j]))->ResetContent();  //init combox0
    flag = FALSE;
    num = 0;
    for(j=0; j<3; j++)
    {
        for (i = 1;i <= 16;i++)
        {//此程序支持16个串口
            str.Format("\\\\.\\COM%d",i);
            hCom = CreateFile(str, 0, 0, 0,
                OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
            if(INVALID_HANDLE_VALUE != hCom )
            {//能打开该串口,则添加该串口
                CloseHandle(hCom);
                str = str.Mid(4);
                ((CComboBox *)GetDlgItem(Comb[j]))->AddString(str);
                if (flag == FALSE)
                {
                    flag = TRUE;
                    num = i;
                }
            }
        }
    }

    for(j=0; j<3; j++)
    {
        i = ((CComboBox *)GetDlgItem(Comb[j]))->GetCount();
        if (i == 0)
        {//若找不到可用串口则禁用“打开串口”功能
            ((CComboBox *)GetDlgItem(Comb[j]))->EnableWindow(FALSE);
        }
        else
        {
            k = ((CComboBox *)GetDlgItem((Comb[j])))->GetCount();
            ((CComboBox *)GetDlgItem(Comb[j]))->SetCurSel(k - 1);
            (*mComAll)++->BindCommPort(num);
            //mCom1.BindCommPort(num);
        }
    }

}

总有错误  error C2664: 'CreateThread' : cannot convert parameter 3 from 'unsigned long (void *)' to 'unsigned long (__stdcall *)(void *)'

按网上的教程  我定义成静态static DWORD WINAPI GetCom(LPVOID lpParameter);   但是问题在于 我函数里有其他的类  CComboBox  不能定义成静态  真心不知道怎么处理  求解答、
搜索更多相关主题的帖子: private 
2013-08-29 23:06
yuccn
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:20 
GetCom 改成静态成员函数,并且把
CComboBox 对象地址作为线程参数传进去就行了。


HANDLE hThread=CreateThread(NULL, 0, GetCom, this, 0, NULL);

DWORD WINAPI CConfigPort::GetCom(LPVOID lpParameter)
{
    CConfigPort *pThis = (CConfigPort *)lpParameter;

    里面的成员访问都改成pThis-> 这样访问就行了

    HANDLE  hCom;
    ~~~~
}

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-08-30 11:56
linkang1024
Rank: 2
等 级:论坛游民
帖 子:90
专家分:83
注 册:2011-10-10
收藏
得分:0 
回复 2楼 yuccn
谢谢啊  现在程序运行比之前快多了  真心感谢.
2013-08-30 16:03
我菜119
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:938
专家分:1756
注 册:2009-10-17
收藏
得分:0 
回复 2楼 yuccn
个人不建议把一个MFC的对象指针传递给另一个线程!

愿用余生致力编程
2013-09-03 15:58
yuccn
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
回复 4楼 我菜119
这个没有关系的,只是不建议在多线程中操作对象的成员而已(其实准确来说就是多线程问题)

如果有需要更新界面或者成员,好的做法就是直接Send 一个消息给对象的窗口,有ui线程(也就是主线程)来同步数据而已。


如果能够很好的处理好多线程问题,传什么都没有关系的

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-09-03 18:59
快速回复:有关线程问题 请教下啊 搞好久了
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020646 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved