如何在 UWP C++/CX 中对象的成员函数中使用 std::thread
How to use std::thread inside a member function of an object in UWP C++/CX
如何使用 UWP 应用程序的std::thread
创建线程?抱歉,我在对象内创建成员函数线程所需的语法有问题。我刚开始在Visual Studio中使用c ++/cx。这是我的代码:
void MainPage::increment(int val)
{
for (int i = 0; i < val; ++i){
m_timer4++;
Sleep(100);
textBox4->Text = m_timer4.ToString();
}
}
void _4ThreadsUWP::MainPage::button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
m_timer->Start();
std::thread th(&MainPage::increment, this, 5);
}
编辑:
我遇到这些错误:
错误 1:
'std::invoke': no matching overloaded function found
错误 2:
Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...)'
我不知道你的构造函数调用到底出了什么问题 - 绑定样式的语法是出了名的古怪,并且给出了最糟糕的错误消息。
我的建议是完全避免std::bind
及其不圣洁的兄弟(例如这个std::thread
构造函数(,并尽可能使用 lambda 函数。它们有自己的怪癖,但它们通常更容易理解,错误消息不是完全的垃圾,它们有更多的应用程序。
在这种情况下,您可以只做:
std::thread th([this]{this->increment(5);});
话虽如此,您的代码在多个层面上在逻辑上是错误的。
正如在注释中已经指出的那样,由于您的线程立即超出范围,因此您将获得异常,因为std::thread
不希望在线程结束或您显式将创建的线程与线程对象分离之前被销毁。所以:
- 要么你调用
join
,在这种情况下是没有意义的,因为现在你的主线程将停止等待工作线程,所以启动线程首先是无用的; - 或者你
detach
它,这很糟糕,因为现在你可以有失控的线程;如果你关闭应用程序窗口,你可能仍然有线程在运行,对正在销毁的数据进行操作。
更好的解决方案是在类级别移动工作线程,单击按钮时启动它(如果尚未启动(,并在窗口关闭时加入它。
但是:无论如何,所有这些都是无用的,因为在几乎每个 GUI 工具包(包括 UWP(中,GUI 对象都不是线程安全的。从不是主 UI 线程的线程调用其方法会导致行为不稳定并崩溃,而您的代码正是这样做的。
有一些方法可以进行安全的跨线程 GUI 调用(通常归结为通过 GUI 事件队列传递消息( - 本文可能有一些与 UWP 相关的建议 - 但这就像用大炮射击蚊子;在您的情况下,您只需要一个常规计时器,没有任何线程。
相关文章:
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针