CDisplay的CPP中定义了一个全局变量strURL,
CDisplay::strDonw(strDownload)
{
strURL=strDownload;
//调用一个线程,此线程中使用strURL这个全局变量
AfxBeginThread(...);
}Void main()
{
CDisplay A;
CDisplay B;
A.strDownload("192.168.1.15");
B.strDownload("192.168.1.40");
}
为什么程序调试过程发现,最后两个对象的线程中strURL都是192.168.1.40,请问怎么解释?全局变量好像作用空间为一个对象吧!

解决方案 »

  1.   

    你想全集变量int a;
    func()
    {
    a=3;a=4;
    }
    你觉得最后a==?如果你想不同的线程对应不同的ip
    就把ip的指针作为参数赋给线程函数
    AfxBeginThread(ThreadProc,&strURL);
      

  2.   

    CDisplay::strDonw(strDownload)
    {
    strURL=strDownload;
    //调用一个线程,此线程中使用strURL这个全局变量
    AfxBeginThread(ThreadProc,&strDownload);  
    }
    //每个线程都从参数中能得到不同的strDownload。
      

  3.   

    不会生成两个全局变量的!你只定义了一个全局变量。
    正如madhappy(545454)所说的。
      

  4.   

    CDisplay::strDonw(strDownload)
    {
    strURL=strDownload;
    ////////////???????????????????????
    AfxBeginThread(...);
    }Void main()
    {
    CDisplay A;
    CDisplay B;
    A.strDownload("192.168.1.15");
    B.strDownload("192.168.1.40");
    }
    个人觉得是个时间问题,因为是多线程,所以是并发的,当A的程序执行到//????????位置时,B
    的strDownload()又开始了,在A的线程还为开启前,B的strURL=strDownload;已经改变了全局变量.
      

  5.   

    不好意思,我测错了。全局变量在进程里只有一个。也就是说
    A.strDownload("192.168.1.15");
    B.strDownload("192.168.1.40");
    第2次调用B.strDownload("192.168.1.40");就把strURL修改为192.168.1.40,我刚才的回复是错误的,不好意思哦
      

  6.   

    谢谢各位的回复,我想继续问的是,我如何声明一个变量,这个变量只在对象A的空间范围有效,而对于对象B的空间范围无效。同时这个变量对于对象A的中全局线程函数可视。我的初衷是想设计一个调用一个线程的类,然后由此类生成的对象,不管多少个,都互不干扰!
      

  7.   

    其实你的问题上面都已经说过了。用传参AfxBeginThread(ThreadProc,&strDownload); 是解决问题的最好办法按你那样的话,要在CDisplay类中定义一个变量。然后通过构造函数对其赋值。
      

  8.   

    是的,通过传地址的访问是能够解决一些问题,但是对于EVENT,MESSAGE呢,这些可都是全局的啊?