C++ 线程处理时出错,std::invoke:

2024-04-25

好吧,这些是我的错误。 std::invoke:找不到匹配的重载函数 // 和 无法专门化函数模板'unknown-type std::invoke("Callable &&,_Types &&...) noexcept()'

我真的需要你们的帮助。我对 C++ 还很陌生,所以我希望您能给我一些如何做到这一点的示例。不仅解释。

这是我的代码:

#include <iostream>
#include <thread>
#include <stdio.h>
#include <Windows.h>
#include <string>




using namespace std;




    void SetColor(int ForgC);
    void Navigation();
    void Switch(int index);
    void UpdateMenu();

    const int IWAL = 1;
    const int ITRI = 0;

    int M_Index = 0;
    int Changes = 0;

    bool Name1 = false;
    bool Name2 = false;

    string bools[2] = { "[OFF]", "[ON]" };

    void Navigation()
    {
        for (;;)
        {
            for (int i = 2; i < 180; i++)
            {
                if (GetAsyncKeyState(i) & 0x8000)
                {
                    switch (i)
                    {
                    case 38:
                        if (M_Index < 2)
                            M_Index++;
                        Changes++;
                        break;
                    case 40:
                        if (M_Index > 0)
                            M_Index--;
                        Changes++;
                        break;
                    case 37:
                        Switch(M_Index);
                        Changes++;
                        break;
                    case 39:
                        Switch(M_Index);
                        Changes++;
                        break;

                    }
                    Sleep(200);
                }
            }
        }
    }

    void Switch(int index)
    {
        if (index == IWAL)
        {
            Name1 = !Name1;
        }
        else if (index == ITRI)
        {
            Name2 = !Name2;
        }

    }

    void UpdateMenu()
    {
        int temp = -1;
        for (;;)
        {
            if (temp != Changes)
            {
                temp = Changes;

                system("cls");

                SetColor(15);
                cout << ">> Krizzo's Menu <<" << endl;
                cout << "___________________" << endl << endl;

                if (M_Index == IWAL)
                {
                    SetColor(10);
                    cout << " Name1\t=\t" << bools[Name1] << endl;
                }
                else
                {
                    SetColor(15);
                    cout << " Name1\t=\t" << bools[Name1] << endl;
                }
                if (M_Index == ITRI)
                {
                    SetColor(10);
                    cout << " Name2\t=\t" << bools[Name2] << endl;
                }
                else
                {
                    SetColor(15);
                    cout << " Name2\t=\t" << bools[Name2] << endl;
                }
            }
        }
    }

    void SetColor(int ForgC)
    {
        WORD wColor;
        //We will need this handle to get the current background attribute
        HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
        CONSOLE_SCREEN_BUFFER_INFO csbi;

        //We use csbi for the wAttributes word.
        if (GetConsoleScreenBufferInfo(hStdOut, &csbi))
        {
            //Mask out all but the background attribute, and add in the foreground color
            wColor = (csbi.wAttributes & 0xF0) + (ForgC & 0x0F);
            SetConsoleTextAttribute(hStdOut, wColor);
        }
        return;
    }

    int main(int argc, char** argv) {
        std::thread t1(Navigation);
        std::thread t2(Switch);
        std::thread t3(UpdateMenu);
        std::thread t4(SetColor);
        t1.join();
        t2.join();
        t3.join();
        t4.join();
        return 0;
    }

Your Switch and SetColor函数带有一个参数。您必须将此参数传递给thread构造函数。例子:

int addOne(int x)
{
    return x + 1;
}

int main()
{
    std::thread t1(addOne, 5);
    t1.join();
}

处理引用参数时,必须将参数包装在std::ref() call:

void addOne(int& x)
{
    x += 1;
}

int main()
{
    int a = 42;
    std::thread t1(addOne, std::ref(a));
    t1.join();
}

最后,当你想在单独的线程上运行类的成员函数时,你必须传递this指针,因为线程必须知道在哪个实例上调用成员函数。

class X
{
    void doSomething()
    {
         std::thread t1(X::expensiveCalculations, this);
         //do something else
         t1.join();
    }

    void expensiveCalculations()
    {

    }
};

int main()
{
    X x;
    x.doSomething();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 线程处理时出错,std::invoke: 的相关文章

  • ASP MVC4 - 通过视图模型传递列表以查看

    我有一个模型人物 其中包括出生日期等字段 我想将所有人的列表以及每个人的计算年龄传递给视图 因此 视图模型 public class vm PersonList public Person Person get set public int
  • C++ 最大非负整数

    以下内容是否会在所有平台 int 大小等上按预期工作 或者有更容易接受的方法吗 我做了以下的事情 define MAX NON NEGATIVE INT int unsigned int 1 2 我不会通过解释它在做什么来侮辱你的智商 编辑
  • __libc_start_main 发生了什么?

    我真的很想理解从高级代码到可执行文件的步骤 但是遇到了一些困难 我写了一个空的int main C 文件并尝试通过以下方式破译反汇编objdump d 这是发生的事情 in start 设置对齐方式 将参数压入堆栈 调用 libc star
  • 如何从 OnChange 事件捕获文本框的值

    在我的 C MVC 应用程序中 我有一系列这样生成的文本框 foreach object item in items Html TextBox 渲染的结果是一系列看起来像这样的文本框
  • 将整数四舍五入到最接近的 10 倍数[重复]

    这个问题在这里已经有答案了 我想弄清楚如何对价格进行四舍五入 双向 例如 Round down 43 becomes 40 143 becomes 140 1433 becomes 1430 Round up 43 becomes 50 1
  • CRTP 能否完全取代小型设计的虚拟功能?

    Is CRTP http en wikipedia org wiki Curiously recurring template pattern有足够的能力智胜virtual功能齐全 我认为 CRTP 的唯一缺点是为每个重复模式生成大量代码
  • 将文件扩展名与应用程序关联

    我编写了一个编辑特定文件类型的程序 我想为用户提供在启动时将我的应用程序设置为该文件类型的默认编辑器的选项 因为我不需要安装程序 我尝试编写一个可重用的方法 通过向 HKEY CLASSES ROOT 添加一个键来为我关联一个文件 最好在任
  • EntityFramework:“参数值超出范围。”

    我在 EntityFramework 模型优先 中保存小数时遇到问题 在我的 EDMX 中 我声明我的属性为 Decimal 30 10 然后我尝试保存该数字 1215867935736100000 结果是 Parameter value
  • g++.exe 和 x86_64-w64-mingw32-g++.exe 有什么区别?

    同样的问题也适用于 gcc ar 等 在 Code Blocks 中将工具链可执行文件从 Something exe 更改为 x86 64 w64 mingw32 something exe 时 代码仍然可以完美编译 此外 32 位和 64
  • C 或 C++ 中是否有轻量级的多部分/表单数据解析器? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑将多部分表单数据解析集成到 Web 服务器模块中 以便可以减轻后端 Web 应用程序 通常用动
  • 类模板的可变参数构造函数模板的特化

    这是一个带有可变参数构造函数的类 它专门用于从临时对象进行复制和移动 template
  • 我应该在查询时调用 ToListAsync()

    不久前 我开始接触 C 并正在寻找一些如何编写代码的最佳实践 现在 我正在使用 EF Core 并具有以下代码 var details dbContext Details Where x gt x Name Button foreach v
  • .NET 配置(app.config/web.config/settings.settings)

    我有一个 NET 应用程序 它具有用于调试和发布版本的不同配置文件 例如 调试 app config 文件指向开发SQL服务器 http en wikipedia org wiki Microsoft SQL Server它启用了调试并且发
  • 在javascript中调用c#函数[重复]

    这个问题在这里已经有答案了 可能的重复 从 Javascript 调用 ASP NET 函数 https stackoverflow com questions 3713 call asp net function from javascr
  • 串行端口轮询和数据处理

    我正在尝试通过微控制器从传感器的多个串行端口读取数据 每个串口将接收超过2000个测量值 每个测量值7个字节 全部为十六进制 而且他们同时开火 现在我正在从 4 个串行端口进行轮询 另外 我将每个测量值转换为字符串并将其附加到字符串构建器
  • ASP.NET 5 (vNext) - 配置

    我正在尝试学习 ASP NET 5 我在 Mac OS X 上使用它 此时 我有一个如下所示的 config json 文件 配置 json AppSettings Environment dev DbSettings AppConnect
  • 为什么这些双精度数的返回值为-1.#IND?

    I have double score cvMatchContourTrees CT1 CT2 CV CONTOUR TREES MATCH I1 0 0 cout lt
  • SoapHttpClientProtocol:以流而不是字符串的形式获取响应?

    我正在使用一种网络服务 它可以一次性输出大量数据 响应字符串可能约为 8MB 虽然在台式电脑上这不是问题 但嵌入式设备在处理 8MB 字符串对象时会发疯 我想知道是否有办法以流的形式获取响应 目前我正在使用如下方法 我尝试使用 POST 请
  • 使用 STL 迭代器而不初始化它

    我想做这样的事情 container iterator it NULL switch eSomeEnum case Container1 it vecContainer1 begin break case Container2 it vec
  • 奇怪的 MSC 8.0 错误:“ESP 的值未在函数调用中正确保存...”

    我们最近尝试将一些 Visual Studio 项目分解为库 并且在测试项目中一切似乎都编译和构建得很好 其中一个库项目作为依赖项 然而 尝试运行该应用程序给我们带来了以下令人讨厌的运行时错误消息 运行时检查失败 0 ESP 的值未在函数调

随机推荐