参加了交通运输学院的一个交通科技大赛,需要与硬件沟通,当然也不是什么好高端的玩意儿,就是一个名为sick的一个德国产的激光扫描仪的使用,叫什么LMS-511;也就是基于TCP/IP通讯的罢了;主要是通过扫描仪发回来的数据把模型重新绘制出来;当然使用到了OpenGL来完成绘制的部分,不过个人觉得OpenGL本来就博大精深,自己皮毛都没有学到,就不在这里说啥子了;这里我们主要讨论怎么在MFC中通过面向对象的方式来使用多线程;
因为C++中的多线程要具体的有使用环境来决定,那么在MFC中就使用MFC的机制来使用的线程AfxBeginThread(FUNCTIONS,(void*));FUNCTIONS 为线程入口函数,后面的指针为传给线程的参数,因为在FUNCTINS 必须为静态函数(而且好像要为全局静态函数才行,试了几种方式,只有把线程函数写成类外部的函数才行),那么就把要使用线程的对象指针作为参数传入就可以了,并在线程函数里面调用对象的函数就相当于一个线程类了;该线程主要用于负责网络数据获取工作;可以看到该线程类中有一个空类型函数指针;由于该线程类是不确定要执行什么功能函数的在设计初期也不可能实现说有功能;并且这样写也更有面向对象的思想;那么在实例化该对象的时候也会传入一个静态函数指针;
直接代码表示吧:
RcvThread.h
#ifndef _RH_
#define _RH_
#include"stdafx.h"
class RecvThread
{
CWinThread* thread;
int interval;
void (*func)(void);
public :
RecvThread(void(*f)(void));
void setInterval(int interval);
void Start();
void Wait();
void Resume();
void Stop();
void run();
};
#endif
RcvThread.cpp
#pragma once
#include"stdafx.h"
#include"RecvThread.h"
UINT FUNCTIONS(LPVOID param){
RecvThread *thread=(RecvThread*)param;
thread->run();
return 0;
}
RecvThread::RecvThread(void(*f)(void))
{
func=f;
if(f==NULL)return;
interval=50;
thread=NULL;
}
void RecvThread::setInterval(int interval)
{
this->interval=interval;
}
void RecvThread::Start()
{
thread=AfxBeginThread(FUNCTIONS,(void*)this);
}
void RecvThread::Wait()
{
SuspendThread(thread->m_hThread);
}
void RecvThread::Resume()
{
ResumeThread(thread->m_hThread );
}
void RecvThread::Stop()
{
TerminateThread(thread->m_hThread,0);
}
void RecvThread::run()
{
while(true)
{
Sleep(interval);
(*func)();
}
}