如何在 qt/c++ 中集成线程
How to integrate Threading in qt/c++
我目前正在构建类似浏览器的应用程序。一部分是 UI 另一部分是对 Android 设备的访问
我有一个 class DeviceMngr,用于实例化访问 android 设备的不同方法。实例化 class 作为参数提供给 QMainWindow。 QMainWindow 将显示一个 QTreewidget 并使用 MyMtpDevice 从 android 设备获取数据。
DeviceMngr *MyMtpDevice = new DeviceMngr;
error = MyMtpDevice->OpenDevice();
MainUI MyWindow(*MyMtpDevice);
如何创建一个线程,其中对 DeviceMngr(如 OpenDevice)的所有调用都在单独的线程中完成,而对此 class 方法的任何其他调用都在该线程中完成。
我想要 UI 的线程和 DeviceMngr
的线程
有实施的想法吗?我尝试了一些但似乎不起作用
这完全取决于您的需要。您可以做几件事,您应该考虑的解决方案之一是 boost::thread
and boost::io_service
。它通过创建一个线程(在你的 DeviceMngr
class 中)和 posting 工作(从其他线程)来工作:
class DeviceMngr
{
public:
DeviceMngr();
~DeviceMngr();
void OpenDevice();
private:
void DeviceMngrThread();
void _OpenDevice() {}
boost::asio::io_service io_service;
boost::thread thread;
bool run;
};
DeviceMngr::DeviceMngr()
: io_service(),
thread(&DeviceMngr::DeviceMngrThread, this), // create thread
run(true) // start running thread
{
}
DeviceMngr::~DeviceMngr()
{
run = false; // stop running the thread
thread.join(); // wait for the thread to finish
io_service.stop();
}
void DeviceMngr::DeviceMngrThread()
{
while (run)
{
// Process work
io_service.run();
// Prepare for more work
io_service.reset();
}
}
void DeviceMngr::OpenDevice()
{
// Post work to do
io_service.post(boost::bind(&DeviceMngr::_OpenDevice, this));
}
调用 OpenDevice
将简单地 post 为 DeviceMngr
线程处理。这个简单的示例应该可以帮助您入门并了解线程的工作原理。我建议从小例子开始,这样你就可以了解它们是如何协同工作的(看起来对 OpenDevice
的调用不会是同步的。如果你需要同步,你可能需要查看 boost synchronisation
我目前正在构建类似浏览器的应用程序。一部分是 UI 另一部分是对 Android 设备的访问
我有一个 class DeviceMngr,用于实例化访问 android 设备的不同方法。实例化 class 作为参数提供给 QMainWindow。 QMainWindow 将显示一个 QTreewidget 并使用 MyMtpDevice 从 android 设备获取数据。
DeviceMngr *MyMtpDevice = new DeviceMngr;
error = MyMtpDevice->OpenDevice();
MainUI MyWindow(*MyMtpDevice);
如何创建一个线程,其中对 DeviceMngr(如 OpenDevice)的所有调用都在单独的线程中完成,而对此 class 方法的任何其他调用都在该线程中完成。
我想要 UI 的线程和 DeviceMngr
的线程有实施的想法吗?我尝试了一些但似乎不起作用
这完全取决于您的需要。您可以做几件事,您应该考虑的解决方案之一是 boost::thread
and boost::io_service
。它通过创建一个线程(在你的 DeviceMngr
class 中)和 posting 工作(从其他线程)来工作:
class DeviceMngr
{
public:
DeviceMngr();
~DeviceMngr();
void OpenDevice();
private:
void DeviceMngrThread();
void _OpenDevice() {}
boost::asio::io_service io_service;
boost::thread thread;
bool run;
};
DeviceMngr::DeviceMngr()
: io_service(),
thread(&DeviceMngr::DeviceMngrThread, this), // create thread
run(true) // start running thread
{
}
DeviceMngr::~DeviceMngr()
{
run = false; // stop running the thread
thread.join(); // wait for the thread to finish
io_service.stop();
}
void DeviceMngr::DeviceMngrThread()
{
while (run)
{
// Process work
io_service.run();
// Prepare for more work
io_service.reset();
}
}
void DeviceMngr::OpenDevice()
{
// Post work to do
io_service.post(boost::bind(&DeviceMngr::_OpenDevice, this));
}
调用 OpenDevice
将简单地 post 为 DeviceMngr
线程处理。这个简单的示例应该可以帮助您入门并了解线程的工作原理。我建议从小例子开始,这样你就可以了解它们是如何协同工作的(看起来对 OpenDevice
的调用不会是同步的。如果你需要同步,你可能需要查看 boost synchronisation