Qt有一个线程循环每5分钟重复一次,这个线程能随时响应中断吗?类似WaitForSingleObject

uncle_z_b 2019-01-15 02:41:57
do{
dosomethind();

}while(WaitForSingleObject(Event,300000) != WAIT_OBJECT_0)
这个是MFC的实现方式 可以随时中断
do{
if(isstop) return;
dosomethind();
sleep(300000);
}while(true)
这种方式的话 在sleep以后如果设置了isstop要等待休眠时间结束才能去响应结束
Qt有类似MFC的实现方式吗? 请各位大神指点一下
...全文
448 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
独孤过 2019-01-15
  • 打赏
  • 举报
回复
引用 3 楼 uncle_z_b 的回复:
[quote=引用 1 楼 独孤由过 的回复:] 那是跟平台有关的底层API,跨平台的Qt很难做到 可以使用C++11的条件变量实现

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <atomic>

std::mutex mutex;
std::condition_variable signal;
std::atomic_bool end;

void functor()
{
	end = false;
	std::unique_lock<std::mutex> locker(mutex);
	int counter = 0;
	while (!end)
	{
		++counter;
		signal.wait_for(locker, std::chrono::milliseconds(5000));
		std::cout << counter << std::endl;
	}
	std::cout << "The end!\n";
}

int main()
{
	std::thread thread(functor);
	std::this_thread::sleep_for(std::chrono::milliseconds(1000));
	end = true;
	signal.notify_one();
	if (thread.joinable())
		thread.join();
	return 0;
}
谢谢了,我也用过类似的方式

	mutex.tryLock();
	QString fileName = QDir::currentPath() + "/systemInfo.log";
	QFile aFile(fileName);
do
{
		aFile.open(QIODevice::Append | QIODevice::Text);
		mutex.unlock();
		mutex.lock();
 } while (!waitMutex.wait(&mutex, 60*1000));
mutex.unlock();
这里的互斥量频繁的锁定解锁,让我看了有点头晕 就没有想到你的这里
std::unique_lock<std::mutex> locker(mutex);
现在有了你的思路我先去试试,有什么问题在交流[/quote] OK
uncle_z_b 2019-01-15
  • 打赏
  • 举报
回复
引用 1 楼 独孤由过 的回复:
那是跟平台有关的底层API,跨平台的Qt很难做到
可以使用C++11的条件变量实现

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <atomic>

std::mutex mutex;
std::condition_variable signal;
std::atomic_bool end;

void functor()
{
end = false;
std::unique_lock<std::mutex> locker(mutex);
int counter = 0;
while (!end)
{
++counter;
signal.wait_for(locker, std::chrono::milliseconds(5000));
std::cout << counter << std::endl;
}
std::cout << "The end!\n";
}

int main()
{
std::thread thread(functor);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
end = true;
signal.notify_one();
if (thread.joinable())
thread.join();
return 0;
}

谢谢了,我也用过类似的方式

mutex.tryLock();
QString fileName = QDir::currentPath() + "/systemInfo.log";
QFile aFile(fileName);
do
{
aFile.open(QIODevice::Append | QIODevice::Text);
mutex.unlock();
mutex.lock();
} while (!waitMutex.wait(&mutex, 60*1000));
mutex.unlock();

这里的互斥量频繁的锁定解锁,让我看了有点头晕 就没有想到你的这里
std::unique_lock<std::mutex> locker(mutex);

现在有了你的思路我先去试试,有什么问题在交流
独孤过 2019-01-15
  • 打赏
  • 举报
回复
当然,Qt也有互斥元、互斥锁、信号、条件变量等 实现思路相似 #include <QMutex> #include <QWaitCondition> QMutex mutex; QWaitCondition signal; signal.wait(&mutex, 5000); signal.notify_one();
独孤过 2019-01-15
  • 打赏
  • 举报
回复
那是跟平台有关的底层API,跨平台的Qt很难做到 可以使用C++11的条件变量实现

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <atomic>

std::mutex mutex;
std::condition_variable signal;
std::atomic_bool end;

void functor()
{
	end = false;
	std::unique_lock<std::mutex> locker(mutex);
	int counter = 0;
	while (!end)
	{
		++counter;
		signal.wait_for(locker, std::chrono::milliseconds(5000));
		std::cout << counter << std::endl;
	}
	std::cout << "The end!\n";
}

int main()
{
	std::thread thread(functor);
	std::this_thread::sleep_for(std::chrono::milliseconds(1000));
	end = true;
	signal.notify_one();
	if (thread.joinable())
		thread.join();
	return 0;
}

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧