Điều này có phần liên quan đến this question, nhưng tôi nghĩ rằng tôi cần biết thêm một chút nữa. Tôi đã cố gắng để có được đầu của tôi xung quanh làm thế nào để làm điều này trong một vài ngày (trong khi làm việc trên các bộ phận khác), nhưng thời gian đã đến để tôi cắn đạn và nhận được đa luồng. Ngoài ra, tôi có thêm một chút thông tin so với câu hỏi được liên kết.boost :: asio, chủ đề và đồng bộ hóa
Thứ nhất, về đa luồng. Vì tôi đã thử nghiệm mã của mình, tôi đã không làm phiền với bất kỳ luồng đa luồng nào. Nó chỉ là một ứng dụng giao diện điều khiển bắt đầu một kết nối đến một máy chủ thử nghiệm và mọi thứ khác sau đó được xử lý. Vòng lặp chính là:
while(true)
{
Root::instance().performIO(); // calls io_service::runOne();
}
Khi tôi viết ứng dụng chính của mình, tôi đoán giải pháp này sẽ không được chấp nhận (vì nó sẽ phải được gọi trong vòng lặp thông báo, trong khi có thể, vấn đề khi khối tin nhắn chờ đợi một tin nhắn. Bạn có thể thay đổi nó để vòng lặp tin nhắn không chặn, nhưng sau đó không phải là sẽ whack việc sử dụng CPU thông qua mái nhà?)
Giải pháp nó dường như là ném một luồng khác vào nó. Tốt. Nhưng sau đó tôi đã đọc rằng io_service::run()
trả về khi không có việc gì để làm. Đó là gì? Đó có phải là khi không có dữ liệu hoặc không có kết nối? Nếu có ít nhất một kết nối tồn tại thì nó vẫn còn sống? Nếu vậy, đó không phải là quá nhiều của một vấn đề như tôi chỉ có để bắt đầu một chủ đề mới khi kết nối đầu tiên được thực hiện và tôi hạnh phúc nếu tất cả dừng lại khi không có gì đang xảy ra ở tất cả. Tôi đoán tôi bối rối bởi định nghĩa 'không có việc phải làm'.
Sau đó, tôi phải lo lắng về việc đồng bộ hóa chuỗi tăng của mình với luồng GUI chính. Vì vậy, tôi đoán các câu hỏi của tôi là:
- Cách thực hành tốt nhất khi sử dụng boost :: asio trong ứng dụng khách có liên quan đến chủ đề và giữ chúng sống như thế nào?
- Khi ghi vào ổ cắm từ sợi chính đến luồng IO, đồng bộ hóa có đạt được bằng cách sử dụng
boost::asio::post
, để cuộc gọi xảy ra sau trong io_service không? - Khi nhận dữ liệu, làm cách nào để mọi người lấy lại dữ liệu cho chuỗi giao diện người dùng? Trong quá khứ khi tôi sử dụng cổng hoàn thành, tôi đã thực hiện một sự kiện đặc biệt có thể đăng dữ liệu trở lại luồng giao diện người dùng chính bằng cách sử dụng :: SendMessage. Nó không thanh lịch, nhưng nó hoạt động.
Tôi sẽ đọc thêm một số ngày hôm nay, nhưng thật tuyệt vời khi có được một người đứng đầu từ một người đã thực hiện việc này. Tài liệu Boost :: asio không tuyệt vời và hầu hết công việc của tôi cho đến nay dựa trên một chút tài liệu, một số thử nghiệm/lỗi, một số mã ví dụ trên web.
+1 io_service :: công việc là cách tôi tự giải quyết vấn đề này. –
cảm ơn phản hồi của bạn. Khi bạn nói có một số khả năng, những cái bạn đã sử dụng trong quá khứ là gì? –
@ Moo-Juice, tôi đã không ở trong tình huống có một chuỗi GUI cụ thể cần xử lý dữ liệu. Tôi chỉ sử dụng cơ chế gọi lại và xử lý dữ liệu từ một chuỗi io_service khi nó đến.Một số hình thức của hàng đợi tin nhắn mà các chủ đề gui đọc, có thể được sử dụng để cho biết sự xuất hiện của dữ liệu mới. Hoặc bạn có thể chỉ cần sử dụng biến có điều kiện. Thực sự phụ thuộc vào ứng dụng, thiết kế và yêu cầu của bạn. –