Tôi có một ứng dụng đọc dữ liệu từ đầu vào tiêu chuẩn bằng cách sử dụng getline() trong một chuỗi. Tôi muốn đóng ứng dụng từ chủ đề chính, trong khi đường dây vẫn chặn luồng khác. Làm thế nào điều này có thể đạt được?Thoát ứng dụng trong khi chặn stdin trên cửa sổ
Tôi không muốn ép buộc người dùng phải nhấn ctrl-Z để đóng stdin và ứng dụng.
Tôi đã cố gắng cho đến nay với các thiết lập trình biên dịch của tôi (RuntimeLibrary =/MT) trên Windows 8.1 64bit, v120 nền tảng công cụ:
- freopen stdin, nhưng nó bị chặn bởi khóa nội
- huỷ sợi , trong đó kêu gọi hủy bỏ()
- rút lại một EOF, dòng dấu chấm hết cho std :: cin, mà cũng bị chặn
* cập nhật *
- Mở cửa sổ mới() không làm việc, exit() bị chặn bởi một khóa
- WINAPI TerminatThread() cuộc gọi hủy bỏ()
- WINAPI CloseHandle (GetStdHandle (STD_INPUT_HANDLE)) treo
- gọi TerminateProcess() - làm việc, nhưng tôi muốn kết thúc tốt đẹp
* cập nhật 2: giải pháp *
- WriteConsoleInput() có thể làm cho std :: getline() trở về từ chặn đọc. Điều này làm việc với bất kỳ thời gian chạy msvc libray nào. Đối với mã giải pháp làm việc, xem câu trả lời được chấp nhận.
Ví dụ mã hiển thị các vấn đề:
#include <iostream>
#include <thread>
#include <string>
#include <chrono>
int main(int argc, char *argv[])
{
bool stop = false;
std::thread *t = new std::thread([&]{
std::string line;
while (!stop && std::getline(std::cin, line, '\n')) {
std::cout << line;
}
});
std::this_thread::sleep_for(std::chrono::seconds(1));
stop = true;
// how to stop thread or make getline to return here?
return 0;
}
[Thread's destructor] (http://en.cppreference.com/w/cpp/thread/thread/~thread) gọi std :: chấm dứt nếu bạn không 'tách()' hoặc 'tham gia() 'trước đó. – Drop
Có lý do nào khiến bạn phân bổ động không? – CoffeeandCode