我弄了一个程序,是用于摄像机图像采集的,我希望实现这样的功能:图像在线采集,在线显示,在线存储。
程序的执行过程是这样的,相机每采集一帧后都会启动如下函数:
int CALLBACK CMainFrame::SnapThreadCallback(HV_SNAP_INFO *pInfo)   //回调函数
{
      ::SendMessage(hwnd, WM_SNAP_CHANGE, 0, 0);
      return 1;
}
WM_SNAP_CHANGE消息我是这样设计的:
LRESULT CMainFrame::OnSnapChange(WPARAM wParam, LPARAM lParam)   
{
        /************************************************************************/
        /* 显示摄像机采集帧率                                                                     */
        /************************************************************************/
SetTitle();
/************************************************************************/
/*图像显示                                                           */
/************************************************************************/
      hThread1=(HANDLE)_beginthread(ShowThread,0,this); if (m_bSave)
{
             hThread2=(HANDLE)_beginthread(SaveThread,0,this);
}

return 1;
}
但是这样设计的程序在运行的过程中存在两个问题:
   1)两个线程是不是并发执行;
   2)程序执行后程序中线程的数量迅速增加,并且程序的运行过程中CPU的使用率高达60%以上。
所以想请问下,在VC中,该如何使得两个线程们频繁的并发进行?
谢谢

解决方案 »

  1.   

    多线程并行,由OS来调度cpu执行,你可以设置线程优先级,让它可以多获得CPU来计算
      

  2.   

    AfxBeginThread(MainThread,&m_stlParam,THREAD_PRIORITY_HIGHEST);   
      

  3.   

    1. 不要使用消息, 消息在重负荷的情况下性能非常糟糕
    2. 自己维护一个FIFO队列,  将工作任务投递到队列里面去
    3. 你可以使用生产者-消费者线程池模型,生产者就是采集, 消费者就是处理, 
    生产者将需要处理的任务投递到队列;消费者线程从队列中获取需要处理的任务。 
    4. 优化多线程,优化多核性能。  
    如果你是多核计算机, 比如有4个核, 那么, 你可以制定 前面2个核心上运行生产者线程。  后面2个核心上运行消费者线程。  每核心陪的线程数 根据你的线程实际情况而定, 保证生产、消费之间的大致平衡。
      BOOL WINAPI SetProcessAffinityMask(
      __in          HANDLE hProcess,
      __in          DWORD_PTR dwProcessAffinityMask
    );
    //  此API用于设置进程的CPU亲缘属性,第2个参数是"位或"表示. 对于2*4核系统,则设置位0xFFDWORD_PTR WINAPI SetThreadAffinityMask(
      __in          HANDLE hThread,
      __in          DWORD_PTR dwThreadAffinityMask
    );
    //  此API用于设置线程的CPU亲缘属性,第2个参数是"位或"表示. 需要注意的是,dwThreadAffinityMask必须是dwProcessAffinityMask的子集DWORD WINAPI SetThreadIdealProcessor(
      __in          HANDLE hThread,
      __in          DWORD dwIdealProcessor
    );
    //  此API用于设置线程的首选CPU,操作系统在调度线程时优先考虑首选核心, 第2个参数是以0为基数的处理器ID 
      

  4.   

    可以考虑使用SwitchToThread函数SwitchToThread
    The SwitchToThread function causes the calling thread to yield execution to another thread that is ready to run on the current processor. The operating system selects the thread to yield to.BOOL SwitchToThread(VOID)
      

  5.   

    DirectShow
      他应该指的是 DirectX 吧