我的代码中有一个线程和一个入口点函数,如下所示:
static void *readerThreadEntryPoint(void *arg)
void *MainWindow::readerThreadEntryPoint(void *arg) {
MODES_NOTUSED(arg);
}
我想用这段代码调用一个函数
QBytearray data = socket->ReadAll();
我该怎么办? 我有一个错误:在静态成员函数QTcpSocket * socket中无效使用成员'MainWindow :: socket'; 我有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错误!