-3

我正在为使命召唤游戏编写一个 DLL,我做了很多工作,但我的问题在于下面的代码:

int func = 0;
-----
if (cl_ingame=1){ Sleep(35);start(); }

void start()
{
command(x,x, "c \"Press up for 11th\"");
func = 1;
Sleep(3000); 
command(x,x, "c \"Press up for Unlock all\"");
func = 2;

if (dpad = up){
if (func = 1){
do11th();
}else if (func = 2){
doUnlock();
} 
}

现在困扰的不是它自己的代码,而是void“start”将成为一个循环的事实,现在我的问题是如果游戏已经忙于循环,我将无法使用任何控件或调用任何函数一个,所以我需要找出如何为 C++ 线程化

我知道谷歌是男人最好的朋友,但它并没有真正解释得非常详细,如果有人可以简单地给我一个示例线程就像这样

(线程){函数}

如何停止线程以及如何调用/启动线程

非常感谢您的帮助

4

1 回答 1

0

启动一个线程非常简单:

#include <thread>
#include <iostream>

void thread_entry(int arg)
{
    std::cout << "Thread running: argument " << arg << std::endl;
}

int main()
{
    std::cout << "Thread starting" << std::endl;
    std::thread thread(thread_entry, 42);
    thread.join();
    std::cout << "Thread finished" << std::endl;
}

在线程运行时与线程通信更复杂。不幸的是,标准 C++ 仍然相当缺乏高级并发性,所以首先使用标准库提供的原子变量、互斥体和条件变量可能是最容易的。简单地停止线程:

#include <thread>
#include <atomic>
#include <iostream>

void thread_entry(std::atomic<bool> & stop)
{
    while (!stop) {
        std::cout << "Thread running" << std::endl;
        sleep(1);
    }
}

int main()
{
    std::cout << "Thread starting" << std::endl;
    std::atomic<bool> stop(false);
    std::thread thread(thread_entry, std::ref(stop));
    sleep(5);
    stop = true;
    thread.join();
    std::cout << "Thread finished" << std::endl;
}

一般来说,线程间的同步比较复杂,容易出错。注意尽量减少线程之间共享的数据量,并仔细考虑你对这些数据所做的一切,确保它永远不会被一个线程访问,而另一个线程可能会改变它。

如果您正在编写游戏,那么更简单的方法可能是单线程事件循环。单个主循环将轮询输入事件并通知程序的各个组件它们已经发生;他们会相应地更新他们的状态,并可能产生更多他们自己的事件。唯一的复杂性是每个事件处理程序必须快速完成其工作以避免阻塞整个程序。

于 2012-09-14T11:08:18.967 回答