2010-03-30 16 views
14

Tôi có một chuỗi công nhân sinh ra từ một GUI (đối với hiệu năng GUI), làm cách nào để truy cập GUI, chẳng hạn như sinh sản các cửa sổ/tiện ích mới từ chính chuỗi đó?Làm cách nào để truy cập GUI (GTK) từ nhiều luồng?

Tôi đã thử sử dụng các đại biểu nhưng có vẻ như nó không hoạt động. Bất kỳ ý tưởng? Có thể là ví dụ? Cảm ơn bạn.

+0

Đại biểu không hoạt động !? Bạn có sử dụng phương thức Control.BeginInvoke() để gọi các đại biểu không? – Cipi

+0

Tôi đã không, bạn có thể xây dựng trên đó? – nubela

+5

Hãy nhớ rằng anh ấy đang sử dụng GTK, không phải Windows Forms, vì vậy API khác nhau (xem bên dưới). –

Trả lời

31

Theo Best Practices của họ:

Gtk # không phải là một bộ công cụ thread-safe, có nghĩa là chỉ có một thread tại một thời điểm có thể yên tâm gọi các phương pháp trên Gtk #. Chủ đề này thường là luồng thực thi vòng lặp chính (đó là khi điều khiển đã được chuyển một cách rõ ràng sang Gtk).

Khi nhà phát triển ứng dụng cần phải cập nhật một số phần tử của giao diện người dùng đồ họa, họ phải có khóa để cho phép họ phát hành Gtk # toolkit invocations hoặc họ có thể thực thi mã của họ trên cùng một luồng với một chuỗi thực thi vòng lặp chính.

Để gọi phương thức trên chuỗi vòng lặp chính GTK + và tránh bất kỳ vấn đề luồng nào với GTK, bạn có thể sử dụng phương thức Gtk.Application.Invoke() (nếu bạn đang nhắm mục tiêu Gtk # 1.0, bạn có thể sử dụng Gtk.ThreadNotify).

Ví dụ sau được cung cấp; bạn nên sử dụng Invoke để thực thi bất kỳ mã Gtk nào trong vòng lặp chính:

public void ThreadedMethod() 
{ 
    Gtk.Application.Invoke(delegate { 
     do_stuff_in_main_thread(); 
    }); 
} 
+0

Nó hoạt động! Tôi có thể chấp nhận ans trong 1 phút, cho tôi rằng min;) Ngoài ra, upvoted! – nubela

+0

Cảm ơn, vui vì nó đã giúp bạn ra ngoài :) –

+0

Làm thế nào để làm điều tương tự trong gtkmm? – fnc12

Các vấn đề liên quan