理解qthreads——在线程之间共享数据
understanding qthreads - sharing data between threads
我开始理解使用线程的机制,但我想我被卡住了,
如果我理解的话,我必须创建我自己的类,释放run()
方法,然后创建线程。
问题是我的线程必须从gui(主线程)中读取一些变量,并且使用它们,它将创建一些其他变量,主窗口将读取和绘图。
的事情是,我正在接收一个蓝牙连接,它必须在一个线程中始终处于活动状态,但gui必须绘制从这个线程读取的值。
这是需要在单独线程上的函数:
// Listen to the device for data
void gui::listen_device()
{
unsigned char buf[10];
unsigned char crcval;
fd_set readmask;
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 28000;
memset (buf, 0, 10);
int v = 0, v1 = 0, v2 = 0;
while(1)
{
int i;
FD_ZERO (&readmask);
FD_SET (sock, &readmask);
if (select (255, &readmask, NULL, NULL, &tv) > 0)
{
if (FD_ISSET (sock, &readmask))
{
int numb;
numb = 0;
numb = recv (sock, buf, 10, MSG_WAITALL);
crcval = BP_CRC8 (buf, 9);
// 8 bits
if (ui->comboBox->currentIndex() == 0)
{
if (crcval == buf[9])
{
s++;
// Print of counter
printf ("%d ->", buf[0]);
fprintf (data, "%d,", buf[0]);
for (int i = 1; i < 9; i++)
{
v = buf[i];
printf ("%d,", v);
fprintf (data, "%d,", v);
}
printf ("n");
fprintf (data, "n");
//fprintf(data, "s: %d, f: %dn", s,f);
}
else
{
f++;
}
}
// 12 bits
else if (ui->comboBox->currentIndex() == 1)
{
if (numb == 14)
{
// Print of counter
printf ("%d,", buf[0]);
fprintf (data, "%d,", buf[0]);
for (i = 1; i < numb - 1; i += 3)
{
v1 = buf[i] | ((buf[i + 1] & 0x0F) << 8);
v2 = buf[i + 2];
v2 = (v2 << 4) | ((buf[i + 1] & 0xf0) >> 4);
printf ("%d,%d,", v1, v2);
fprintf (data, "%d,%d,", v1, v2);
}
printf ("n");
fprintf (data, "n");
}
}
}
}
}
}
和这里读到的一些变量是全局的,如sock, data, and the ui->combobox
。
我希望buf
与主窗口共享。
任何建议吗?
更新:为什么这是错误的?
void QMyThread::run()
{
listen_device();
}
这是一篇关于在Qt中使用线程的好文章
http://qt - project.org/doc/qt 5.0 -/- qtcore/thread basics.html
有几种方法可以做到这一点。如前所述,您可以使用互斥锁。使用QByteArray
(例如void something(QByteArray)
)参数或QThreadStorage
进行排队连接都是可行的解决方案,尽管前者更简单,可能更适合您的情况。
同样,永远不要子类化QThread
。使用QObject
和moveToThread()
代替。QThread
驻留在主线程中,简单地管理它创建的线程。如果在使用moveToThread()
之前将信号连接到对象,请确保在QObject::connect()
中使用Qt::QueuedConnection
参数。
相关文章:
- 在c代码之间共享数据的最佳方式
- DLL共享数据的推荐方式是什么
- 简单使用 std::atomic 在两个线程之间共享数据
- 跨线程共享数据集与拆分每个线程的数据
- 如何实现共享数据的复制构造函数
- 在 c++ 中,在线程之间共享数据容器的最佳方法是什么?
- PHP 中的实时仪表板,可从C++共享数据
- 如果两个线程调用同一个函数,但函数中的所有变量都是局部变量,我还需要担心线程之间共享数据吗?
- 在 API 和应用程序线程之间共享数据
- 加入线程后,是访问共享数据的数据竞赛吗?
- 在C 中,如何有效地在两个类之间共享数据
- 是否可以在本机C++模块之间共享数据
- 通知线程是否始终需要在修改期间锁定共享数据
- 共享数据文件映射
- 在线程之间共享数据
- 游戏中图形和物理引擎之间共享数据
- 我应该如何共享数据结构
- 如何找到Windows PC的共享数据/文件夹
- 在 Python 和 C++ 之间共享数据
- 如何将比较和交换用于任何共享数据结构的免等待互斥