why?你难道不能用线程池~而且你应该让B正常退出!,切忌!

解决方案 »

  1.   

    可以用线程池啊,减少系统开销
    还有就是最好不要用TerminateThread强制终止线程
      

  2.   

    谢谢,这么快回复。
    如果了解RTOS,就知道,RTOS得没有task基本上都是下面的格式
    void tak_a()
    {
         init();     while(1){
             **********
             **********
             tsk_dly(5);  //这个task休息5ms,让别的task执行。
         }
    }没个task等待执行的方式,有多种,有时间等待,也有等待某个事件(比如等待邮件)
    n多的task中,有一个是控制task,这个task对于别的task有生杀大权。
    当系统断电时,这个控制task会关闭所有task,然后自己退出。
      

  3.   

    如果了解RTOS,就知道,RTOS得没有task基本上都是下面的格式
    ==〉                       的每个
      

  4.   

    用ExitThread关闭线程,等待其安全退出
      

  5.   

    CreateEventSetEvent在线程里wait for single or multi object 
      

  6.   

    To:Tr0j4n
    ExitThread这个API只能关闭自线程,也就是我上面说的B线程自己调用,才能关闭,这个方案行不通。To:xdljf
    利用消息来处理调度,这个可能是比较行的通的方案。
    但是,如果可以强制回收资源,这是最好的,也是最可靠的。因为变动不能太大,首先考虑用最单纯的方法解决问题,哪怕这个单纯的方法很复杂,但是至少这个复杂的方法,对于整个系统而言是单纯的。
      

  7.   

    To:oLINo
    那你线程的资源申请要做到A线程能访问,在强制结束B之前,释放这些资源
    〉〉
    这个方法可行,能不能告诉我具体的方法,比如
    1。如何将B线程的资源申请到A中
    2。如果释放这些资源给我API就可以。或者关键字。
      

  8.   

    13楼的说法不敢苟同。线程的堆栈其实别的线程完全可以修改访问,只要用到Debug API就可以了。线程B所有申请的资源都都由A管理。比如Heap、Handle等,Heap管理有HeapCreate、HeapAlloc、之类的(更详细请查MSDN)。如果你对线程B的内存不放心,可以自己管理(C++默认的new使用的是HeapAlloc,在它的crt堆上)线程B申请的资源都保存其地址和类型、申请的线程ID,到一个全局的list,干掉线程后去全局list里查找,把相关的资源释放。
      

  9.   

    强制回收业不是不可以。麻烦了。每次都到堆上创建,然后记下指针和大小,手工调用HeapFree进行释放你恐怕需要一个全局区逐个标记这些资源了,如果资源种类不多的话还好
      

  10.   

    为什么要反复创造是为了完成什么功能? 直接挂起来不行吗?  用标志位加waitfor就可以正常退出了。
      

  11.   

    到底是在嵌入式的RTOS上还是Windows上?不同的系统有自己的一套设施。
      

  12.   

    嵌入式的RTOS要移植到windows上。为了是嵌入式的应用程序在windows上执行。**嵌入式**|        | **Windows**
    --APP----|        |--APP------
    --RTOS---|   ==>> |--RTOS-----

    --MCU----|        |--WINDOWS--上图结构所示,APP层,和 RTOS本身的代码是可以测试的。具体大家不用关注应用,解释起来很麻烦。有没有办法,强制回收资源?
      

  13.   

    我有两个疑问:
    1,线程B,也就是需要反复创建的,执行的是不是一种无限循环,没有出口的任务,所以线程A只能强制终结B,而B不能主动去结束?
    2,RTOS有自己的独特的环境,在Windows下有其他的实现途径,你有没有考虑过使用线程池?有没有考虑过使用信号量,事件等设施让B知道自己必须退出?
      

  14.   

    第一个问题:B线程不可能自己退出,RTOS中的每个Task是一个无限循环,没办法是它退出。因为Task得代码不能修改。第二个问题:现在每一个Task就是一个线程,Windows上线程的退出方式,最好就是自己退出,而这一点现在做不到,因为,RTOS是实时打断方式,比如Task B执行到一半,很有可能就让出执行权,给优先级高的task A执行,而这个优先级高的task A,突然发现了某一个信号,然后他负责杀死Task B,在RTOS中杀死的方式,就是不在调度这个task B,也就是Task B不在等待队列中。接下来Task A,发现信号恢复,重新创建Task B,而在嵌入式中,只需要将,pc指针,以及sp指针初始化就可以。记住Task B被杀以后,Task B 是有可能停留在任何地方的,也就是PC指针可能指向到Task B得while循环的任何地方,如果在windows上,使用消息通知B,使它关闭,一旦Resume Task B得线程,B线程必然继续由上次停止的地方开始,继续往下执行,这样就有可能发生错误,因为嵌入式原系统设计中,认为此时B不能被执行。它必须停止。
    不知道,我有没有说明白。。
      

  15.   

    那么Task申请的资源方式也无法更改了吧?无论如何你 Thread来模拟Task,强制结束的话一定会泄漏资源的。
    我觉得你还是用Process来模拟Task比较好,Windows操作系统能够保证,进程结束的时候它所申请的所有资源都会被释放。当然对Dll维护全局数据可能造成一定影响,不过基本上你的进程是自己写的可以注意和避免这方面的问题。
      

  16.   

    如果是完全不能修改RTOS上程序的代码就可以理解了。
    那我是否可以理解为你想在Windows上虚拟出一个RTOS,并在此虚拟环境下运行进程A和B?
    如果是这样,我建议你在这个虚拟层上分配资源,然后交付RTOS中的A和B使用。
    强制结束线程没关系,只要保证资源“好借好还再借不难”即可。
    让这个虚拟机来向windows申请资源,A和B可以强制结束,到最后虚拟机退出的时候,再归还资源。
      

  17.   


    这个基本上是不可能的,目前系统有30几个task,况且,task间还要通信,很麻烦。