如何在c ++中从静态线程入口点函数调用其他函数?

时间:2015-02-21 10:10:52

标签: c++ qt pthreads

我的代码中有一个线程和一个入口点函数,如下所示:

    static void *readerThreadEntryPoint(void *arg)

    void *MainWindow::readerThreadEntryPoint(void *arg) {
    MODES_NOTUSED(arg);     
}

我想用这段代码调用一个函数

    QBytearray data = socket->ReadAll();

我该怎么办? 我有一个错误:在静态成员函数QTcpSocket * socket中无效使用成员'MainWindow :: socket'; 我有2个线程,一个用于读取缓冲区,另一个用于处理数据!

2 个答案:

答案 0 :(得分:3)

在创建线程期间,您应该将指针作为arg传递给类的实例。这样,您可以在静态方法中执行此操作,而不是将arg标记为“未使用”:

void *MainWindow::readerThreadEntryPoint(void *arg) {
    MainWindow* self = static_cast<MainWindow*>(arg);

从那时起,您可以使用self类似于非静态方法的隐式this。或者你可以简单地调用另一种非静态的方法,但是能够真正起作用,例如:

self->readerThreadEntryPointImpl(); // non-static method call

答案 1 :(得分:1)

找到解决方案, 我改变了这一行

pthread_create(&Modes.reader_thread, NULL, readerThreadEntryPoint, NULL);

到这个

pthread_create(&Modes.reader_thread, NULL, readerThreadEntryPoint, this);

然后我使用了@John Zwinck的建议,我编写了以下代码,

MainWindow *instance = static_cast<MainWindow *>(arg); QByteArray data= instance->socket->readAll();

我解决了SIGSEGV错误!