学习vc多线程编程碰到的有关问题,该向线程函数传递什么样的参数

学习vc多线程编程碰到的问题,该向线程函数传递什么样的参数
学习vc多线程编程碰到的问题,该向线程函数传递什么样的参数

我本来都是在哪个类中开始线程,就像它传递该类的指针
譬如   要建一个线程处理   doc中的数据   就传递   doc指针   以调用相关的一些处理函数

UINT   CDoc::ThreadProc(LPVOID   pParam)
{
ASSERT(pParam   !=   NULL);
CDoc   pDoc   =   (CDoc)pParam;

while(pDoc-> m_bThreadWorking)
{
Sleep(20);//等待与ReceiveThreadProc线程同步
pDoc-> PraseArray();
}

return   0;    
}
         
      要建一个线程处理   view中的数据   就传递   view指针    
        UINT   CView::ThreadProc(LPVOID   pParam)
      {
ASSERT(pParam   !=   NULL);
CView   pView   =   (CView)pParam;

while(pView-> m_bThreadWorking)
{
Sleep(20);//等待与ReceiveThreadProc线程同步
pView-> UpdateView();
}

return   0;    
        }  
         
      但是在看   mfc   windows程序设计   的多线程编程时,才知道跨线程调用MFC成员函数
  会引起断言错误   那就不应该直接传递CDoc   CView指针,那应该怎么传递参数呢   以调用函数?

------解决方案--------------------
线程中调用传入指针的线程函数很安全的吧,我一直这么干呢
------解决方案--------------------
线程函数的参数,
就是启动线程的时候带的参数,
这样,你可以在启动线程的时候,把你需要的参数传递给线程。
通常,你线程要做的第一件事情,就是把参数强制类型转换成正确的数据类型
(就是启动线程的时候传递的那个参数的实际类型).

一般而言,普通的对象跨线程使用并没有问题。
比如CString, CFile等
然而有的对象(比如CWnd和所有从CWnd派生的类,包括CMainFrm,CView等),它把自己和某个线程关联起来(比如CWnd,它需要一个确定的线程来处理它接受到的消息),这种对象就不能跨线程使用。

对于CWnd,如果其他线程需要控制它,可以得到它的句柄(HWND可以跨线程使用),用
PostMessage等给它发送一个消息。

------解决方案--------------------
你看这样行不行:
对于你要处理的动作代码全部都放到mainFrame中处理.那咱们可以向线程中传送主窗口的HWND,通postMessage或者SendMessage来呼唤主窗口帮你帮处理你要做的事情.我都是这么干的.这样的好处是就是只要做好消息响应什么事都OK了
------解决方案--------------------
在MFC多线程编程中,最好不要从别的线程中直接调用界面线程中的函数,你可以使用线程同步的方法来实现你的目的。最好的方式是传递消息。根据你的描述,我猜测你的本意可能是在别的线程中修改doc中的数据,如果是这样的话,你可以在view,frame中接收消息,对数据进行修改,这也符合MFC文档视图架构的本意。
------解决方案--------------------
up
------解决方案--------------------
to
xuelinger(只爱陌生人)

楼主自己不需要UP,
你可以直接 "将帖子提前 "
------解决方案--------------------
这个是我写USB通信时用的线程参数,一个结构体
struct Context
{
HWND m_hWnd;
HANDLE hDevice;
BOOL bTerminateThread;
BYTE *pBuf;

Context() // default value
{
bTerminateThread=FALSE;
hDevice=INVALID_HANDLE_VALUE;
}
};

这个是线程函数,用来读资料
UINT ThreadProc(LPVOID lpData)
{
Context *pContext=(Context*)lpData;
while(!pContext-> bTerminateThread)
{
OVERLAPPED overlap;
DWORD bytesRead;
DWORD waitStatus;
BOOL readStatus;
memset(&overlap, 0, sizeof(OVERLAPPED));
overlap.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
readStatus = ReadFile(pContext-> hDevice, pContext-> pBuf, 9, &bytesRead, &overlap); // read data from device
if(readStatus) SetEvent(overlap.hEvent);
while(1)
{
waitStatus = WaitForSingleObject (overlap.hEvent, 1000 );
if(WAIT_OBJECT_0 == waitStatus) break;null jump loop
}
CloseHandle(overlap.hEvent);

PostMessage(pContext-> m_hWnd,WM_DISPLAY_READ_DATA,0,(LPARAM)pContext);