创建线程是传递参数!!!

时间:2008-05-13 16:09:23   来源:论坛整理  作者:  编辑:chinaitzhe
我想在创建线程的同时传进一个其他类的指针参数
这么做对吗

或者应该怎么做?


C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





#ifndef __B__H__

#define __B__H__



#include <iostream>

#include <windows.h>

#include "A.h"



class CA;



using namespace std;



class CB

{





public:



    HANDLE hEvent;



    void InitResource(CA *pcb)

    {

        DWORD dwThreadID;

        HANDLE hThread = CreateThread(

                                    NULL,

                                    0,

                                    process,

                                    (LPVOID)pcb,

                                    0,

                                    &dwThreadID);        

    }



    static DWORD WINAPI process(LPVOID pParam)

    {

        HANDLE hEvent;

        CA *pca = (CA*)pParam;

        while (1)

        {

            DWORD dwRet;

            dwRet = WaitForSingleObject(hEvent);

            if (dwRet == WAIT_OBJECT_0)

            {

                int i = pca->Get();

                cout<<i<<endl;

            }

        }

    }

    

private:





};



#endif




网友回复:当然可以,MFC就是这么做的,但是要注重使用这个类指针时最好加锁
网友回复:可以这么用,不过就是小心不要出什么同步的问题或者悬挂指针。
网友回复:注重同步吧
网友回复:那刚才得那个程序中
静态函数里的
pca不能识别是怎么回事?
网友回复:找不到CA类的定义
网友回复:
引用 5 楼 lights_joy 的回复:
找不到CA类的定义


是的。但是我在“A.h”中其实已经定义了CA
为什么在静态方法中看不到呢?
网友回复:我也是这么做的,运行的很好
但多线程最难的是同步问题
你的代码中没有实现
自己改下吧

网友回复:
引用 7 楼 andy_cai 的回复:
我也是这么做的,运行的很好
但多线程最难的是同步问题
你的代码中没有实现
自己改下吧


pca那行无法识别的问题你没碰到?。。。。
另一个类CA有什么非凡要注重的问题吗?

我把全部代码都放上
帮忙看下!

C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





#ifndef __B__H__

#define __B__H__



#include <iostream>

#include <windows.h>

#include "A.h"

#include "AB.h"



class CA;



using namespace std;



class CB

{





public:







    void InitResource(CA *pcb)

    {

        DWORD dwThreadID;

        HANDLE hThread = CreateThread(

                                    NULL,

                                    0,

                                    process,

                                    (LPVOID)pcb,

                                    0,

                                    &dwThreadID);        

    }



    void InitEvent()

    {

        hEvent = CreateEvent(

                            NULL,

                            FALSE,

                            FALSE,

                            NULL);

    }



    static DWORD WINAPI process(LPVOID pParam)

    {

        class CA;

        CA *pca = (CA*)pParam;        

        while (1)

        {

            DWORD dwRet;

            dwRet = WaitForSingleObject(hEvent, INFINITE);

            if (dwRet == WAIT_OBJECT_0)

            {

                int i = pca->Get();

                cout<<i<<endl;

            }

        }

    }

    

private:

    



};



#endif





#ifndef __A__H__

#define __A__H__



#include <windows.h>

#include <stdio.h>

#include "B.h"

#include "AB.h"





class CA

{

public:



    CA()

    {

        a = 0;

    }

    

    static int Get()

    {

        return a;

    }



    void Change(int temp)

    {

        a = temp;

    }

    

    void InitResource()

    {

        DWORD dwThreadID;

        HANDLE hThread = CreateThread(

                                    NULL,

                                    0,

                                    process,

                                    (LPVOID)this,

                                    0,

                                    &dwThreadID);

    }



    static DWORD WINAPI process(LPVOID pParam)

    {

        while(1)

        {

            int a;

            scanf("%d", &a);

            CA ca;

            ca.Change(a);

            SetEvent(hEvent);

        }

    }



private:



    int a;

};



#endif





#ifndef __AB__H__

#define __AB__H__



HANDLE hEvent;



#endif



#include "A.h"

#include "B.h"

#include "AB.h"



int main()

{

    CA ca;

    CA *pca = &ca;

    CB cb;

    ca.InitResource();

    cb.InitEvent();

    cb.InitResource(pca);

    return 0;

}




网友回复:我只是说你的指针传递方式正确

看了你的代码
我无语了

ca.InitResource();
cb.InitEvent();
cb.InitResource(pca);
之后
main函数马上结束
ca析构
你那些子线程会发生什么事?

我没有编译你的代码
不知道实际运行后果会是什么
网友回复:我可以在里面加sleep等待,或者加while循环

但首先我想让他编译通过!!!
网友回复:
引用 10 楼 sunhuanwen 的回复:
我可以在里面加sleep等待,或者加while循环

但首先我想让他编译通过!!!


你应该在main中判定子线程是否结束才能决定要不要return

比如设置一个全局变量

你的代码大可不必如此复杂
比如一个全局变量作为读取的公共缓冲区就可以了

现在你的头文件互相包含应该会有问题
a.h 中不需要包含#include "B.h"吧?
网友回复:都是很好的建议! 值得学习
关键字:创建,线程,传递,参数,

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面