先定义了一个全局数组,int array[10];我在中断函数中
{
  int *p = new int [10];
  //这里我现在是随便赋值
  for(...)
 {
  *(p+i) = i;
 }
 PostThreadMessage(*p,10);//把p送给消息处理
 //是这里释放p呢?
 delete [] p;
 p = NULL;

}//对应消息处理函数,简单化了
message(w,l);
{
  int *k = (int *)W;
  for(...)
  {
    array[i] = *(k+i);
  }
  delarray();//数据处理函数
  //还是这里处理
  //delete [] k;
  //k = NULL;

}直接在输入框内打的,如果排版或者逻辑错误别在意,意思到了就行了,请大家帮忙看看

解决方案 »

  1.   

    要看PostThreadMessage是否成功,成功就在线程free,失败就马上free
      

  2.   

    正常情况,应该是第一种比较合理的,不过你PostThreadMessage()立即返回了,如果立刻释放资源可能会导致消息处理函数处理已经释放的内存,所以建议你这里用第二种方法。
      

  3.   

    PostThreadMessage(, (WPARAM)p, 10);之后,不能立即删除,因为对应的消息可能还没有执行呢;所以,应该在对应消息处理函数 message 中删除;另外,#1 说得对,PostThreadMessage 也存在理论上失败的可能,虽然这不常发生;
      

  4.   

    在中断里不要delete [] p;要保留该内存和其数据被锁定.不能释放.PostThreadMessage(*p,10);这句有问题,光传一个数没有用
    要传地址PostThreadMessage((WPARAM)p,10);在处理数据完成的地方删除
    delarray();//数据处理函数
    delete [] k;
      

  5.   

    觉得两种各有弊端
    1.new了之后没有看见成对的delete,代码给别人的使用,很容易被误解。
    2.delete的很无厘头,也不是很安全。最好不要用这样的方式传递
    宁愿写一个全局的类
    构造里new ,析构里delete
    看你的代码你也不介意全局数据~
      

  6.   

    我在中断函数中,从外部接收到一个数组,int Rec[20]
    {
      int *p = new int [10];
      //这里我现在是随便赋值
      for(i=0;i<10;i++)
     {
      *(p+i) = Rec[i];
     }
     PostThreadMessage((WPARAM)p,10);//把p送给消息处理
      int *t = new int [10];
      //这里我现在是随便赋值
      for(i=0;i<10;i++)
     {
      *(t+i) = Rec[i+10];
     }
     PostThreadMessage((WPARAM)t,10);//把t送给消息处理
    }
    后面处理一样,用同一个消息处理,会有问题吗?
      

  7.   

    永远记住:
    new一块内存
    等同于坐公共汽车抢位置你朋友没上来
    但你要为他占位置
    那么你就要告诉别人说:这里已经有人了如果你delete了,就等于说:这里没有人
    如果这时候别人坐了,就等于内容不是你想的内容了.所以你应该是在你朋友不需要了后(比如下车)才宣布
    否则查票员说:62号座位的同志请买票,你买还是不买?
      

  8.   

    是的,在一个线程中,这样执行就等同于FIFO,不出现数据同步问题。
      

  9.   


    引用都会出错,唉是的,在一个线程中,这样执行就等同于FIFO,不出现数据同步问题。
      

  10.   

    谢谢大家,上面的问题我知道了,再问个,呵呵,我问题多
    两个中断,接收的数据格式一样,就是内容拆包方式一样。
    中断1 Rec[20];中断2 Rec1[20];
    Interrupt1()
    {
      int *p = new int [10];
      //这里我现在是随便赋值
      for(i=0;i<10;i++)
     {
      *(p+i) = Rec[i];
     }
     PostThreadMessage((WPARAM)p,10);//把p送给消息处理
     //这里应该还是消息发送成功与否判断,是吧
      int *t = new int [10];
      //这里我现在是随便赋值
      for(i=0;i<10;i++)
     {
      *(t+i) = Rec[i+10];
     }
     PostThreadMessage((WPARAM)t,10);//把t送给消息处理
    }
    Interrupt1()
    {
      int *p = new int [10];
      //这里我现在是随便赋值
      for(i=0;i<10;i++)
     {
      *(p+i) = Rec1[i];
     }
     PostThreadMessage((WPARAM)p,10);//把p送给消息处理
      int *t = new int [10];
      //这里我现在是随便赋值
      for(i=0;i<10;i++)
     {
      *(t+i) = Rec1[i+10];
     }
     PostThreadMessage((WPARAM)t,10);//把t送给消息处理
    }能发给同一消息处理吗?
    还是说必须用两个消息函数分别处理,如果分别处理,消息处理里面调用的函数也要做两份吗?
    这里两个中断由两个线程控制,有可能会同时触发。
    用同步机制可行吗?互斥是用在中断里呢,还是用在消息里。
      

  11.   

    用一个函数,同时创建 10 个线程也是可以的,你可以看看别的 csdn 的帖子。实际需要什么特殊处理,要看你的项目是否需要了。
      

  12.   

    典型的所有权问题,在多模块程序设计常见,即哪里申请,何处释放的问题。对于楼主所述的postmessage这种情况,建议使用资源池,标记各个资源,当资源不够时添加资源,当空闲资源超过一定数时释放资源即可。
      

  13.   

    PostThreadMessage 是异步的。所以你不能保证 那个内存对方已经使用完毕了,所以你Delete会导致错误的。
      

  14.   

    1. PostThreadMessage 发送可以失败.要判断是否成功.
    2. 即使发送成功也要等用完了才删除..具体怎么知道用完了.有很多方法.
    3. 可以由接收线程来释放内存,但释放内存的函数指针可以通过PostThreadMessage发送给目的消息处理线程.
    由目的消息线程同时获得 [内存]和[释放内存的方法].
    因为申请内存的方法多种多样,释放内存的方法也多种多样.这个需要配对.
    我的想法是,谁申请的内存,它必须同时给出一个函数来释放内存.
    谁来释放,都没问题.但需要解决同步..假如由接收线程来释放,那不需要考虑同步.但需要告诉接收线程如何释放内存.
    就是传递上面提到的一个释放内存函数.
      

  15.   

    struct array
    {
    int* data;
    int cout;
    }
    bool freearray(array* arr)
    {
    delete [] arr.data;
    delete arr;
    }
    arraya* x = new array;
    x.data = new int[10];
    x.cout = 10;
    PostThreadMessage((WPARAM)x,(LPARAM)freearray);类似这么个思想..楼主可以考虑一下.