MFC中如何建立和结束一个线程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MFC中如何建立和结束一个线程相关的知识,希望对你有一定的参考价值。

请说详细点,比如应该调用什么函数,在哪个类里调用该函数等,谢了!
还有一个问题,这个简单点,如何结束一个定时器?比如已经设置了一个定时器,但他只在程序的某一部分中有用,想在这一部分运行结束后关掉定时器,该用什么函数?尽量说明一下函数各参数代表什么,谢谢!!

参考技术A 用CreateThread函数创建线程,用TerminateThread结束线程。具体参考msdn。

如何在 vc++ mfc 中使用非静态方法创建线程

【中文标题】如何在 vc++ mfc 中使用非静态方法创建线程【英文标题】:how to create a thread using a non static method in vc++ mfc 【发布时间】:2011-05-14 11:12:23 【问题描述】:

我正在使用这个调用创建一个线程:

m_pThread=AfxBeginThread(read_data,(LPVOID)hSerial);

read_data 是我班级中的静态方法。

但我想调用一个非静态方法并创建一个线程。

因为我想在这个线程和我的一个类方法之间共享一个变量。

我尝试使用静态变量,但它给出了一些错误。

【问题讨论】:

【参考方案1】:

你不能使用函数的非静态成员作为线程过程来创建线程:原因是类的所有非静态方法都有一个隐式的第一个参数,这是指针 this。

这个

class foo

  void dosomething();
;

其实是

class foo

  void dosomething(foo* this);
;

因此,函数签名与线程过程所需的签名不匹配。您可以将静态方法用作线程过程并将 this 指针传递给它。这是一个例子:

class foo

  CWindThread* m_pThread;
  HANDLE hSerial;

  static UINT MyThreadProc(LPVOID pData);

  void Start();
;

void foo::Start()

  m_pThread=AfxBeginThread(MyThreadProc,(LPVOID)this);


UINT foo::MyThreadProc(LPVOID pData)

  foo* self = (foo*)pData;

  // now you can use self as it was this

  ReadFile(self->hSerial, ...);

  return 0;

【讨论】:

【参考方案2】:

我不会重复马吕斯所说的,但会补充说我使用以下内容:

class foo

    CWindThread* m_pThread;
    HANDLE hSerial;

    static UINT _threadProc(LPVOID pData);
    UINT MemberThreadProc();

    void Start();
;

void foo::Start()

    m_pThread=AfxBeginThread(_threadProc,(LPVOID)this);


UINT foo::MyThreadProc(LPVOID pData)

    foo* self = (foo*)pData;
    //  call class instance member
    return self->MemberThreadProc();


UINT foo::MemberThreadProc()

    //  do work
    ReadFile(hSerial, ...);
    return 0;

每次在 MFC 应用程序的类中使用线程时,我都会遵循这种模式。这样我就可以方便地让所有成员都像我一样在课堂上。

【讨论】:

以上是关于MFC中如何建立和结束一个线程的主要内容,如果未能解决你的问题,请参考以下文章

MFC主线程等待另一个线程结束

安全终止MFC线程

远程线程DLL注入, 如何释放DLL和结束DLL的线程

mfc线程里面调用的套接字库会不会随着线程结束而自动释放?

mfc如何使用多线程搜索文件夹?

VC6.0的程序结束后进程不自动结束,如何解决?