注册 登录
编程论坛 VC++/MFC

MFC 多线程问题

limj1987 发布于 2014-02-26 07:46, 1153 次点击
我用VS2005创建了一个对话框应用程序,对话框上放了两个按钮(IDC_BUTTON_START和IDC_BUTTON_STOP)和一个编辑框(IDC_EDIT_TIME)。目的是点击开始按钮后,开启一个线程,在线程函数中,将当前时间显示在编辑框内,但在编译过程中VS2005总提示编译出错:error C2440: “类型转换”: 无法从“overloaded-function”转换为“LPTHREAD_START_ROUTINE”,这个错误就是在CreateThread函数这块,不清楚是为什么,请各位大神帮忙看看
头文件定义:
// CMultiThreadDlg 对话框
class CMultiThreadDlg : public CDialog
{
// 构造
public:
    CMultiThreadDlg(CWnd* pParent = NULL);    // 标准构造函数
   
    void ThreadFunc();
    volatile bool m_bRun;//表征线程是否正在运行
    HANDLE hThread;//线程句柄
    DWORD ThreadID;//线程ID

// 对话框数据
    enum { IDD = IDD_MULTITHREAD_DIALOG };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持


// 实现
protected:
    HICON m_hIcon;

    // 生成的消息映射函数
    virtual BOOL OnInitDialog();
    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()
public:
    afx_msg void OnBnClickedButtonStart();
public:
    afx_msg void OnBnClickedButtonStop();
};

源文件:
void CMultiThreadDlg::OnBnClickedButtonStart()
{
    // TODO: 在此添加控件通知处理程序代码
    hThread=CreateThread(NULL,
        0,
        (LPTHREAD_START_ROUTINE)ThreadFunc,
        NULL,
        0,
        &ThreadID);
    GetDlgItem(IDC_BUTTON_START)->EnableWindow(FALSE);
    GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(TRUE);


}

void CMultiThreadDlg::OnBnClickedButtonStop()
{
    // TODO: 在此添加控件通知处理程序代码
    m_bRun=FALSE;
    GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE);
    GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE);
}

void CMultiThreadDlg::ThreadFunc()
{
    CTime time;
    CString strTime;
    m_bRun=TRUE;
    while(m_bRun)
    {
        time=CTime::GetCurrentTime();
        strTime=time.Format("%H:%M:%S");
        ::SetDlgItemText(AfxGetMainWnd()->m_hWnd,IDC_EDIT_TIME,strTime);
        Sleep(1000);
    }
}
1 回复
#2
yuccn2014-03-02 12:27
你看一下  LPTHREAD_START_ROUTINE 的原型,它不是void类型的

typedef DWORD (__stdcall *LPTHREAD_START_ROUTINE) (
    [in] LPVOID lpThreadParameter
);

参考:http://msdn.(v=vs.110).aspx

所以你的线程函数应该定义成这样
static DWORD WINAPI ThreadFunc();

对应的函数体也要做相应的修改。

你定义的函数类型不对,原型应该是一个DWORD的函数,调用方式应该是stdcall,同时函数应该属于类模版而不是对象,所以它就应该是静态的了
1