关于CMiniThread

123tom   2010-1-6 09:59 楼主
各位,我最近在弄TW9910驱动,驱动中我自己定义的类继承了CMiniThread类,启动IST线程的时候ThreadStart()貌似执行过去了,我在ThreadStart()前后都加了输出,都能看到。但是线程没有被启动,加在线程执行函数里面的输出也没有打出来。

各位有碰到过类似情况的么???

回复评论 (15)

没人了解么?
点赞  2010-1-6 10:19
最好不要用类,虽然我不知道CMiniThread类是什么,它用到了什么东东

但有一种可能是,它所用到的东东还没有准备好
点赞  2010-1-6 10:21
楼上的有道理啊,不过没准备好就不会给我返回成功状态呀,奇怪。
点赞  2010-1-6 10:28
CMiniThread封装了线程相关的操作,方便使用.
封装的操作如下:
BOOL    ThreadStart(); // 如果创建的是挂起的线程, 需要调用此函数唤醒线程.
BOOL    ThreadStop(); // 如果线程是运行的, 挂起线程
BOOL    CeSetPriority( int nPriority ) // 设置线程优先级
BOOL    ThreadTerminated( DWORD dwMilliSeconds ) // 终止线程
BOOL    WaitThreadComplete( DWORD dwMilliSeconds ) // 等待线程结束
BOOL    ForceTerminated(); // 强行终止线程
DWORD GetThreadId(); // 获取线程id
BOOL IsTerminated(); // 线程是否终止
HANDLE GetThreadHandle(); 获取线程句柄
BOOL GetExitCodeThread( LPDWORD lpExitCode ); // 获取线程结束代码
更具体的细节可以参见微软提供的源代码:%WINCEROOT%\PUBLIC\COMMON\OAK\INC\cmthread.h

ThreadStart()只是将线程唤醒, 也就调用ResumeThread()函数
线程应该是运行起来了, CMiniThread::ThreadRun是怎么实现的?内部是否有等待的事件?
点赞  2010-1-6 10:31
CMiniThread,来源我没找到,MSDN上也没搜到过。
点赞  2010-1-6 10:31
引用: 引用 5 楼 lbqhope 的回复:
CMiniThread,来源我没找到,MSDN上也没搜到过。


这个类只是封装了一些操作 方便实用的, 直接调用API才处理会比较复杂点 而且容易出错.
类似的类还有CRegistryEdit
点赞  2010-1-6 10:33
引用: 引用 4 楼 flandy1982 的回复:
CMiniThread封装了线程相关的操作,方便使用.
封装的操作如下:
BOOL? ? ThreadStart(); // 如果创建的是挂起的线程, 需要调用此函数唤醒线程.
BOOL? ? ThreadStop(); // 如果线程是运行的, 挂起线程
BOOL? ? CeSetPriority( int nPriority ) // 设置线程优先级
BOOL? ? ThreadTerminated( DWORD dwMilliSeconds ) // 终止线程
BOOL? ? WaitThreadComplete( DWORD dwMilliSeconds ) // 等待线程结束
BOOL? ? ForceTerminated(); // 强行终止线程
DWORD GetThreadId(); // 获取线程id
BOOL IsTerminated(); // 线程是否终止
HANDLE GetThreadHandle(); 获取线程句柄
BOOL GetExitCodeThread( LPDWORD lpExitCode ); // 获取线程结束代码
更具体的细节可以参见微软提供的源代码:%WINCEROOT%\PUBLIC\COMMON\OAK\INC\cmthread.h

ThreadStart()只是将线程唤醒, 也就调用ResumeThread()函数
线程应该是运行起来了, CMiniThread::ThreadRun是怎么实现的?内部是否有等待的事件?


多谢啦!
以下是ThreadRun的实现,第一行的输出没打印出来过。
如果说ThreadStart是唤醒线程,那么唤醒后就是要执行ThreadRun函数了?

DWORD CameraHal::ThreadRun()
{
    RETAILMSG(1, (_T("Entering %s\r\n"), _T(__FUNCTION__)));

    while ( m_hCaptureEvent != NULL && !IsTerminated() )
    {
        DWORD dwCause;

        RETAILMSG(CAMERA_HAL_DBG,(_T("%s() Waitfor Event: 0x%x\r\n"), _T(__FUNCTION__), m_hCaptureEvent));

        dwCause = WaitForSingleObject( m_hCaptureEvent, m_dwISTTimeout);

        if (  dwCause == WAIT_OBJECT_0 )
        {
            RETAILMSG(CAMERA_HAL_DBG,(_T("Event Catched from:0x%x(%d)\r\n"), m_hCaptureEvent, m_CamOperationMode));        

            if(m_CamOperationMode == VIDEO_CAPTURE)
            {
                if(m_dwSkipFrameCnt >= 1)
                {
                    m_dwSkipFrameCnt = 2;
                    pfnCallbacks.pfnCameraHandleVideoFrame(pfnCallbacks.dwCameraDriverContext);
                }
                else
                {
                    m_dwSkipFrameCnt++;
                }
            }
            else if(m_CamOperationMode == STILL_CAPTURE)
            {
                // This will be taken on LAST IRQ
                if(m_dwSkipFrameCnt >= 1)
                {
                    m_dwSkipFrameCnt = 2;
                    SetEvent(m_hCaptureFinishEvent);
                    RETAILMSG(1,(TEXT("C%d\r\n"), m_dwSkipFrameCnt));
                }
                else
                {
#if USE_LASTIRQ_STILLCAPTURE                    
                    m_regCAM->CIOCTRL |=(1<                     m_regCAM->CIIMGCPT &= ~(CAM_GLOBAL_CAPTURE_ENABLE_BIT);
                    m_regCAM->CIOCTRL &= ~(1< #endif
                    m_dwSkipFrameCnt++;

                    RETAILMSG(1,(TEXT("L%d\r\n"), m_dwSkipFrameCnt));
                }
            }            
            else if(m_CamOperationMode == PREVIEW_CAPTURE)
            {
                if(m_dwSkipFrameCnt >= 1)
                {
                    m_dwSkipFrameCnt = 2;
                    pfnCallbacks.pfnCameraHandlePreviewFrame(pfnCallbacks.dwCameraDriverContext);
                }
                else
                {
                    m_dwSkipFrameCnt ++;
                }
            }   

            if(m_CamOperationMode == POST_PROCESSOR)
            {
                SetEvent(m_hPostCmdDoneEvent);
            }

            // Clear Interrupt Pending
            SET_BIT(m_regCAM->CIGCTRL, BP_CAM_IRQ_CLR);
            SET_BIT(m_regCAM->CIOCTRL, BP_CAM_FRAME_END);
           
            InterruptDone(m_CamSysIntr);

                        RETAILMSG(TRUE,(_T("%s(): PREVIEW INTR DOWN \r\n"), _T(__FUNCTION__)));
        }
        else
        {
            CAMIF_ERR((_T("[CAMIF:ERR] ++%s() : Exit %d, Cause %d\r\n"), _T(__FUNCTION__), GetLastError(), dwCause));
        }
    }
    RETAILMSG(TRUE,(_T("%s(): Thread Finished"), _T(__FUNCTION__)));
    return 1;
}
点赞  2010-1-6 10:40
找到那个文件了,谢谢匡兄。
CMiniThread( DWORD dwStackSize = 0, BOOL bSuspended = FALSE )
我在构造函数初始化了基类:CMiniThread(0, TRUE),
按理说,调用ThreadStart后,ResumeThread会被调用,失败返回FALSE,除非ThreadStart已经在之前被调用过。
点赞  2010-1-6 10:50
是这样的, 你在调用ThreadStart的时候返回是TRUE吗?会不会线程没有创建成功?
点赞  2010-1-6 10:52
CMiniThread(0, TRUE) 这样初始化是不用调用ThreadStart的.. 线程直接就开始运行了
应该用CMiniThread(0, FALSE)
点赞  2010-1-6 10:54
引用: 引用 9 楼 flandy1982 的回复:
是这样的, 你在调用ThreadStart的时候返回是TRUE吗?会不会线程没有创建成功?

同意,楼主,你创建了这个线程没?
点赞  2010-1-6 10:56
谢楼上的,我刚才仔细查了一下,正如楼上所说,线程已经开始运行了。
只不过,WaitForSingleObject一直没等来事件。
我再查查代码。
点赞  2010-1-6 11:00
引用: 引用 12 楼 lbqhope 的回复:
谢楼上的,我刚才仔细查了一下,正如楼上所说,线程已经开始运行了。
只不过,WaitForSingleObject一直没等来事件。
我再查查代码。

印象中该线程是在minithread的构造函数中创建,很多的驱动,如sd和usb中都会用到该类,另外很多厂家做的模块驱动中也经常看到继承该类的类,主要方便与线程的创建和管理,使用起来的确很方便
点赞  2010-1-6 11:07
最好不要用类,虽然我不知道CMiniThread类是什么,它用到了什么东东
点赞  2010-1-6 11:52
在serial驱动也用到这个类。。。正常情况下,就LZ所说那样通过ThreadStart来开始IST
点赞  2010-1-6 12:45
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复