考虑一个简单的程序:(需要
-std=c++11 -lpthread -lreadline -lSDL2
使用g++和pthread编译时)
#include <iostream>
#include <thread>
#include <SDL2/SDL.h>
#include <cstdlib>
extern "C" {
#include <readline/readline.h>
}
int main(int argc, char *argv[])
{
SDL_Init(SDL_INIT_VIDEO);
auto window = SDL_CreateWindow("title", 0, 0, 200, 200, SDL_WINDOW_SHOWN);
std::thread console([](){
while (true) {
char *console_input_c_str = readline("> ");
if (console_input_c_str == NULL)
break;
std::cout << "line: " << console_input_c_str << '\n';
std::free(console_input_c_str);
}
});
while (true) {
SDL_Event event;
SDL_WaitEvent(&event);
std::cerr << "received event type "<<event.type<<'\n';
if(event.type == SDL_WINDOWEVENT &&
event.window.event == SDL_WINDOWEVENT_CLOSE)
break;
}
SDL_DestroyWindow(window);
SDL_Quit();
console.join();
}
主线程创建一个窗口
window
使用sdl2,输入sdl事件循环,而线程
console
使用从控制台重复读取
readline
. 当窗口退出时,它等待控制台线程完成,然后退出。
程序运行良好;但是,
如何使控制台线程在窗口退出时停止?
如果程序只使用一个线程就可以了。如果退出控制台readline退出程序也可以。
Exit readline is easy
,但所有答案都有问题-
pthread_kill
或
reset -Q
不可携带。
Terminating a thread is easy
(使用)
std::terminate
或
.detach()
,但控制台处于错误状态,因为
读出线
不要正常终止。要重置控制台,可以使用
复位-Q
,但那不是便携式的。
使用readline的替代(异步)接口不起作用,因为sdl不监听控制台上的事件。使用
select
也不便于携带。