Tujuan Saya
Saya ingin memiliki utama pengolahan benang (non GUI), dan dapat spin off Gui di latar belakang mereka sendiri benang yang diperlukan, dan setelah saya non GUI benang tetap bekerja. Dengan kata lain, saya ingin main non-GUI-benang untuk menjadi pemilik dari GUI-benang dan bukan sebaliknya. I'm tidak yakin ini bahkan mungkin dengan Windows Forms(?)
Latar belakang
Saya memiliki komponen sistem berbasis di mana kontroler beban dinamis majelis dan instantiates dan menjalankan kelas-kelas yang menerapkan umum IComponent
antarmuka dengan metode tunggal DoStuff()
.
Komponen mana yang akan dimuat dikonfigurasi melalui file konfigurasi xml dan dengan menambahkan majelis baru yang berisi implementasi yang berbeda dari IComponent
. Komponen-komponen yang memberikan fungsi utilitas untuk aplikasi utama. Sedangkan program utama melakukan itu's hal, misalnya mengendalikan sebuah pabrik nuklir, komponen-komponen yang mungkin akan melakukan utilitas tugas (dalam benang mereka sendiri), misalnya membersihkan database, mengirim email, mencetak lelucon lucu pada printer, apa yang telah anda. Apa yang saya inginkan, adalah untuk memiliki salah satu dari komponen ini dapat menampilkan GUI, misalnya dengan status informasi untuk mengatakan pengiriman email komponen.
Seumur hidup dari sistem yang lengkap akan terlihat seperti ini
DoStuff()
untuk menginisialisasi dan membuatnya hidup sendiri di benang mereka sendiri.Saya belum berhasil melakukan point 3 jika komponen kebakaran GUI di DoStuff()
. Itu hanya sekedar menghentikan sampai GUI ditutup. Dan tidak sampai GUI ditutup apakah program maju ke titik 4.
Ini akan menjadi besar jika komponen-komponen ini diizinkan untuk memulai mereka sendiri Bentuk Windows Gui.
Masalah
Ketika sebuah komponen mencoba untuk api up GUI di DoStuff()
(tepat pada baris kode adalah ketika komponen berjalan Aplikasi.Menjalankan(theForm)
), komponen dan oleh karena itu sistem kami "hang" di Aplikasi.Run()
line sampai GUI ditutup. Nah, hanya dipecat GUI bekerja dengan baik, seperti yang diharapkan.
Contoh dari komponen. Satu belum't apa-apa untuk melakukan dengan GUI, sementara kedua kebakaran lucu windows dengan merah muda berbulu kelinci di dalamnya.
public class MyComponent1: IComponent
{
public string DoStuff(...) { // write something to the database }
}
public class MyComponent2: IComponent
{
public void DoStuff()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form());
// I want the thread to immediately return after the GUI
// is fired up, so that my main thread can continue to work.
}
}
Saya telah mencoba ini tidak berhasil. Bahkan ketika saya mencoba untuk menjalankan GUI di it's thread sendiri, eksekusi hentikan sampai GUI seperti tertutup.
public void DoStuff()
{
new Thread(ThreadedInitialize).Start()
}
private void ThreadedInitialize()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form());
}
Apakah mungkin untuk melakukan spin off GUI dan kembali setelah Aplikasi.Run()
?
Aplikasi.Run metode menampilkan salah satu (atau lebih) bentuk dan memulai pesan standar loop yang berjalan sampai semua bentuk yang tertutup. Anda tidak bisa memaksa kembali dari metode tersebut kecuali dengan menutup semua bentuk-bentuk atau memaksa aplikasi shutdown.
Anda dapat, namun, lulus ApplicationContext (instad Bentuk baru()) untuk Aplikasi.Menjalankan metode dan ApplicationContext dapat digunakan untuk meluncurkan beberapa bentuk sekaligus. Aplikasi anda hanya akan berakhir ketika semua orang yang tertutup. Lihat di sini: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.run.aspx
Juga, setiap bentuk yang anda Lihat non-modally akan terus berjalan bersama anda bentuk utama, yang akan memungkinkan anda untuk memiliki lebih dari satu windows yang tidak saling menghalangi satu sama lain. Saya percaya ini adalah benar-benar apa yang anda mencoba untuk mencapai.
I'm yakin hal ini dimungkinkan jika anda hack itu cukup sulit, tapi saya'd sarankan adalah bukan ide yang baik.
'Windows' (yang anda lihat pada layar) yang sangat ditambah untuk proses. Artinya, setiap proses yang menampilkan GUI diharapkan memiliki Pesan Loop, yang memproses semua pesan yang terlibat dengan menciptakan dan mengelola windows (hal-hal seperti 'mengklik tombol', 'menutup aplikasi', 'redraw layar' dan sebagainya.
Karena ini, itu lebih atau kurang diasumsikan bahwa jika anda memiliki pesan loop, harus tersedia untuk seumur hidup dari proses anda. Misalnya windows bisa mengirim 'berhenti' pesan, dan anda perlu untuk memiliki sebuah pesan loop yang tersedia untuk menangani itu, bahkan jika anda've punya apa-apa pada layar.
Anda bertaruh terbaik adalah melakukannya seperti ini:
Membuat fake bentuk yang tidak pernah ditampilkan yang anda 'utama aplikasi' Start up Aplikasi Panggilan.Menjalankan dan lulus dalam palsu ini bentuk. Lakukan pekerjaan anda di thread lain, dan peristiwa kebakaran di thread utama ketika anda perlu untuk melakukan hal Gui.
I'm tidak yakin jika ini adalah benar, namun aku ingat berjalan jendela bentuk dari konsol aplikasi dengan hanya newing bentuk dan memanggil newForm.Show() di atasnya, jika anda menggunakan komponen yang bukan Aplikasi.Run() maka bentuk baru seharusnya't blok.
Tentu saja komponen yang akan bertanggung jawab untuk menjaga referensi untuk menciptakan bentuk-bentuk