如何写 执行耗时任务的、可随时立即退出的函数 呢?

如题。

稍微解释下,因为有可能有人会误会:放新线程里面去不就可以了?这没有解决问题。如此的话,你那个线程函数怎么写?或者线程函数里调用的某个任务函数怎么写?总之,多线程虽然总是出现在这些问题的解决方案中,但不是多线程解决了这个问题。嗯……不知道说清楚了没?

目前我心里的答案只有这一种模式:

bool DoTask(HANDLE hQuitSignal)
{
    while (!QuitCondition)
    {
        if (WaitForSingleObject(hQuitSignal, 0) == WAIT_OBJECT_0)
        {
            return false;
        }

        // Do something
    }

    return true;
}

其中,“// Do something”部分要细化到瞬间执行完成的细度。

但是我很困惑的是,如果这些任务很繁重,难道我必须每进行一些操作就 if (WaitForSingleObject(hQuitSignal, 0) == WAIT_OBJECT_0) 检查下吗?这样岂不是这种检测代码充斥在任务中了?

不知各位有何经验和体会,求教~

1 Comments

  1. Lo 说道:

    我的作法是这样 你的xlLib 真不错 我很喜欢的风格
    HANDLE GetSleepHandle()
    {
    static DWORD dwSleepTls = 0;

    if ( !dwSleepTls )
    {
    dwSleepTls = TlsAlloc();
    }

    HANDLE hSleep = (HANDLE)TlsGetValue(dwSleepTls);
    if ( !hSleep )
    {
    hSleep = CreateEvent(NULL, TRUE, FALSE, NULL);
    TlsSetValue(dwSleepTls, hSleep);
    }
    return hSleep;
    }

    BOOL MySleep(DWORD dwMil)
    {
    HANDLE hSleep = GetSleepHandle();
    if( WaitForSingleObject(hSleep, dwMil) == WAIT_TIMEOUT )
    {
    return TRUE;
    }
    return FALSE;
    }

0 Trackbacks

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>