首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WINAPI:在类成员函数上创建新线程--不可压缩的参数类型

WINAPI:在类成员函数上创建新线程--不可压缩的参数类型
EN

Stack Overflow用户
提问于 2019-02-27 16:48:35
回答 1查看 281关注 0票数 0

我一直在重新设计一些相当过程性的C++,使其变得更加优雅。最初的代码运行得很好,其中的一部分会启动一个新线程来进行一些文件清理。执行此清除操作的函数是新线程的入口点。请参阅下面的代码。注意:这段代码不会执行,但它显示了工作原理。

代码语言:javascript
运行
复制
#include <stdlib.h>

// Structure for passing application data to a new thread.
typedef struct threadData {
    networkShare*   netArchive;
    rig*            rigInfo;
    rigDatabase*    dbConn;
    networkConn*    netConn;
    char*           logBuffer;
} THREADDATA;

// Global handle to a mutex object
// Used to control access to the inter thread log buffer
HANDLE ghMutex;

DWORD WINAPI cleanLocalArchive(LPVOID lpParam) {
    THREADDATA* p_threadData = (THREADDATA*)lpParam;

    // ... Do stuff ...

    return <<something>>;
}

int main(int argc, char** argv) {
    // Variables for local archive thread
    HANDLE h_CleanerThread = 0;
    THREADDATA* p_threadData = NULL;
    DWORD dwThreadId;

    // Create a mutex with no initial owner
    ghMutex = CreateMutex(
        NULL,              // default security attributes
        FALSE,             // initially not owned
        NULL);             // unnamed mutex

    if (ghMutex == NULL) {
        printf("CreateMutex error: %d\n", GetLastError());
        return 1;
    }

    // Declare the data structure for passing app setting to a new Thread and populate it.
    p_threadData = DBG_NEW THREADDATA;
    p_threadData->netArchive    = &rigArchive;
    p_threadData->rigInfo       = &thisRig;
    p_threadData->logBuffer     = (char*)malloc(BUF_SIZE);
    p_threadData->dbConn        = &archiveDB;
    p_threadData->netConn       = &netConnection;

    // Initialise p_threadData->logBuffer in case we never put anything else in there.
    sprintf_s(p_threadData->logBuffer, BUF_SIZE, "");

    // Start a new thread
    h_CleanerThread = CreateThread(
        NULL,                   // default security attributes
        0,                      // use default stack size  
        cleanLocalArchive,      // thread function name
        p_threadData,           // argument to thread function 
        0,                      // use default creation flags 
        &dwThreadId);           // returns the thread identifier 


    // ... Do other stuff ...

    return 0;
}

我现在已经将代码重构为类,函数"cleanLocalArchive“是应用程序类AircatFeeder的成员函数。当我在in CreateThread()中调用这个成员函数时,根据对代码所做的操作,我会得到各种错误:

As-is: call line = "cleanLocalArchive,“

代码语言:javascript
运行
复制
error C3867: 'AirCatFeeder::cleanLocalArchive': non-standard syntax; use '&' to create a pointer to member

因此,我添加了一个符号: call line = "&cleanLocalArchive,“

代码语言:javascript
运行
复制
error C2276: '&': illegal operation on bound member function expression
error C2660: 'CreateThread': function does not take 5 arguments

经过一些绞尽脑汁和Google之后,我找到了链接,我希望它能解决这个问题。这肯定说明了原因。我在类之外创建了一个包装函数,并尝试调用它。其职能和要求如下:

函数调用:

代码语言:javascript
运行
复制
// Start a new thread
    h_CleanerThread = CreateThread(
        NULL,                       // default security attributes
        0,                          // use default stack size  
        trampoline,         // thread function name
        p_threadData,               // argument to thread function 
        0,                          // use default creation flags 
        &dwThreadId);               // returns the thread identifier 

包装函数:

代码语言:javascript
运行
复制
DWORD trampoline(LPVOID data) {
    AirCatFeeder* scheduler = static_cast<AirCatFeeder*>(data);
    return scheduler->cleanLocalArchive(data);
}

然而,我最后还是收到了同样的问题/错误消息。无论我调用成员函数还是包装函数,IntelliSense仍然报告类似的错误消息:

代码语言:javascript
运行
复制
argument of type "DWORD(*)(LPVOID lpParam)" is incompatible with parameter of type "LPTHREAD_START_ROUTINE"

希望我现在能明白我想要达到的目标。有人能告诉我我做错了什么吗?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-05 16:39:49

由汉斯·帕桑特提供答复。见关于问题的评论:

蹦床在其定义中缺少WINAPI。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54910534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档