定义了一个结构类型的全局变量
struct PARAMS{
  CString  dirname;
  CString  filename;
 }   *PPARAMS
PARAMS   param1;  
把它作为参数传给线程函数AfxBeginThread(myThreadFunc,&param1,THREAD_PRIORITY_NORMAL,0,0,NULL),
线程函数如下:
UINT myThreadFunc(LPVOID lparam)
{   PPARAMS     pparam;
    pparam = (PPARAMS)lparam;
      ...
     return 0;
}
创建线程函数需要多次调用,它完成将传过来的结构里面的变量写入一个文件内。
但是有可能多次调用的过程中,全局变量已经被改变,而线程传递参数,传递的是指针,也就是一个地址,    pparam = (PPARAMS)lparam;也是让pparam指向全局变量的地址,所以,我的日志里面有的时候有写错 的地方,怎么样把变量而不是变量的地址传给线程函数呢。
  在线程函数里面用
   pparam->dirname = lparam->dirname;这样分别赋值可以么。

解决方案 »

  1.   

    如果不是结构体呢,本来是想传字符串,应该怎么写
    线程函数只能用pvoid类型的参数啊
      

  2.   

    1. pparam->dirname = lparam->dirname;这样分别赋值可以么。
    不行,首先你必须对pparam指针赋值才行。
    2.线程函数参数LPVOID lparam是一个指针类型,即能传递四个字节的信息。一般情况下使用这四个字节作为指针变量来传递。当然你可以通过参数直接传递一个整数值,而不是用指针。
    3.传递字符串,必须使用字符串指针,然后通过字符串指针获取字符串。不然线程参数四个字节也装不下你的字符串啊。
      

  3.   

    谢谢tttyd, 
    1.不行的话,我要怎样给pparam 赋(初?)值,用什么函数;编译的时候也说这个变量没有初始化,我不记得指针怎样初始化了,new?
    2.用lptstr做线程函数的参数么,那么我在线程函数里面用getdata函数取字符串的值?还是要定义char[]来进行赋值取出来。
    3.我觉得你说的有理
      

  4.   

    to  liuchaotao
    因为它会不断变化的,所以传给线程,在线程执行过程中,还没有用呢,可能值就已经变了,所以我要传值,不想传指针。
      

  5.   

    搞不清楚楼主具体想要怎么做我知道的是楼主要用以个线程去保存一个全局的结构体里面的数据,但由于结构体数据会变化的关系所以保存的时候会出错那么首先是这个全局的数据是否存在线程抢占访问的情况,有的话是否保护好这个变量在操作时的线程间同步其次是你烦恼是否线程启动后还没开始保存,第二个版本的数据就更新了全局变量导致你漏存了一个版本的数据如果存在同步问题的话,首先是吧变量保护做好,如果不是复杂的多线程的话建议用Mutex因为简单不易出错如果存在线程数据保存版本的问题的话你在启动的时候先New一个类型跟你的全局变量一样的结构体,把数据拷贝进去然后再把这个新的new出来的结构体传进线程里面,你new的现成控制好就行。这个方法比较简单,但最后会存在保存顺序的问题,虽然每个版本都能保存下来,线程启动后你就不知道哪个版本会先存进文件里面。因为具体不知道你要干嘛所以不好帮你分析。
      

  6.   

    谢谢蚊子,我是用完成端口监控文件夹改变,然后把里面目录名和文件名取出来,用线程实现写入日志,线程函数里面用mutex实现对日志的写入,但是可能一个写日志线程没有写完,处理另一条记录的线程再次调用写日志线程,这时候传给写日志的目录名和文件名变量已经改变了。调用写日志线程,把信息传给他,在他内部我要复制一份变量,不能用指针所指向地址里面的值,我不能干涉他的改变,也不能让写日志线程去写已经被改变的值。简单说就是,全局变量在改变,我不干涉他的改变,也不能让线程用被改变了的变量值,所以我想传给线程固定的值,可以对结构用new,就算初始化了?
      

  7.   

    谢谢liuchao,tao,呵呵
    全局变量必须不时的改变,线程函数也必须用变之前的值,所以我要传值,不能只传指针。
    我在线程里面赋值传过来的参数指向的地址里面的值
      

  8.   

    1. 你的代码里不是已经给他赋值了吗? pparam = (PPARAMS)lparam;
       PARAMS  param1,传入线程的参数,对结构里的变量分别赋值就行了
    2.在线程函数中直接将lparam赋值给lptstr就可以了。 lptstr = (LPSTR)lparam;
      

  9.   

    能给出伪代码不?如果你是用Mutex的话,你是怎么操作的?你的Mutex锁住的仅仅是写的过程么?为什么不锁住全部变量?而且还有一个很大的问题,“处理另一条记录的线程再次调用写日志线程”你的线程都是随便启动的?线程启动完后自己就销毁自己了?我建议的方法是,你要把你的全局变量的操作也加锁,按照你现在的情况可以这样改:struct PARAMS{ 
      CString  dirname; 
      CString  filename; 
    };
    typedef struct PARAMS CPARAMS//先用 CPARAMS New 一个变量 tmpParam
    全局的CPARAMS的Lock()
    //拷贝 全局的CPARAMS 到 tmpParam
    全局的CPARAMS的UnLock()然后 tmpParam 传给线程进行
    AfxBeginThread(myThreadFunc,&tmpParam,THREAD_PRIORITY_NORMAL,0,0,NULL);线程里面不知道你怎么实现的给不了意见。
      

  10.   

    to  haipoliehu:
    太复杂了,我怕我又会出错。
    to蚊子:
    我的线程就是随便启动的,然后线程函数里面return 0;这个是不是相当于 _endthread();自己销毁自己。
    我就用线程里面new下试试,传过来的是地址,但是我可以通过地址复制一份值过来。
      

  11.   


    1.我在线程里面用pparam->dirname = lparam->dirname,获取参数指向地址里面的值时,它编译时说我pparam没有初始化,所以我问是不是应该先new下pparam;
    2.你说线程定义是?
    UINT myThreadFunc(LPVOID lparam) 
    {  //PPARAMS    pparam; 
       CString   pparam
        pparam = (LPSTR)lparam; 
          ... 
        return 0;