Olası birkaç GUI konuları "kapalı dönmeye" için? (Application.Run, sistemi durdurma değil)

oy
20

Amacım

Ben bir ana işleme parçacığı (non GUI) sahip olmak ister ve gerektiğinde kendi arka plan konuda GUI kapalı dönmeye edebilmek ve benim ana olmayan GUI iplik çalışmaya devam sahip olacaktır. Başka bir deyişle, benim ana olmayan GUI iplik GUI-iplik sahibi olması değil, tam tersi istiyorum. Bu, Windows Forms ile bile mümkün olduğundan emin değilim (?)

Arka fon

Bir kontrol dinamik ortak uygulama düzenekler ve başlatır ve çalıştırmak sınıflarını yüklemek olan bir bileşen temelli bir sisteme sahip IComponenttek bir yöntem ile arayüz DoStuff().

Hangi bir xml yapılandırma dosyası üzerinden ve farklı uygulamalarını içeren yeni meclisleri eklenerek yapılandırıldı yüklenen bileşenleri IComponent. Bileşenler ana uygulama programı fonksiyonları sağlar. Ana program bir nükleer santral kontrol, bu şey örneğin yapıyor iken, bileşenler sana ne var, e-posta gönderme yazıcıda komik şakalar baskı, veritabanı temizliği örneğin (kendi Konuda) yarar görevleri yerine olabilir. Ne, istiyorum bu bileşenlerin biri dedi e-posta gönderme bileşeni için durum bilgileri ile örneğin bir GUI, görüntülemek mümkün olmasıdır.

Tüm sistemin ömrü şöyle

  1. Uygulama başlar.
  2. yük bileşenler için yapılandırma dosyasını kontrol edin. Onları yükleyin.
  3. Her bileşen için, koşmak DoStuff()onu başlatmak için ve kendi iş parçacığı kendi yaşam olun.
  4. Sonsuza işin ana uygulama-zımbırtı kral yapmaya devam edin.

Henüz bileşen bir GUI kadar kovarsa başarıyla noktası 3 gerçekleştirmek mümkün olmamıştır DoStuff(). GUI kapatılana kadar Basitçe sadece durur. Ve GUI kapanıncaya kadar 4 noktasına programı ilerleme yok.

bu bileşenler kendi Windows GUI Forms başlatmak için izin verildi eğer iyi olurdu.

Sorun

Bir bileşen bir GUI ateşlemek çalıştığında DoStuff()(bileşen çalıştığında kod kesin çizgidir Application.Run(theForm)at), bileşen ve dolayısıyla sistemimiz askıda kalır Application.Run()GUI kapanana kadar hat. Beklendiği gibi Eh, sadece kadar ateş GUI, gayet iyi çalışıyor.

bileşenlerin örneği. Bir tanesi pembe kabarık tavşanlar ile ikinci yangınları şirin pencereler ederken, GUI ile ilgisi olmayan bir ilgisi yoktur.

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.
    }
}

Hayır şans ile bu çalıştılar. Ben kendi iş parçacığı GUI ateşlemek için denemek bile kapalı olarak, yürütme GUI kadar durur.

public void DoStuff()
{
    new Thread(ThreadedInitialize).Start()
}

private void ThreadedInitialize()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form());
}

Bir GUI kapalı dönmeye ve sonra geri dönmek mümkün mü Application.Run()?

Oluştur 05/08/2008 saat 22:19
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
11

Application.Run yöntemi, bir (veya daha fazla) formları gösterir ve her türlü kapalı kadar çalışır standart mesaj döngü başlatır. Sen tüm formlarını kapanış veya bir uygulama kapatma zorlayarak dışında o yönteminden dönüşü zorlayamaz.

Ancak, bir geçebilir ApplicationContext Application.Run yöntemine (yeni Formunun instad ()) ve ApplicationContext Aynı anda birkaç formu başlatmak için kullanılabilir. Bunların hepsi kapalı olduğunda Başvurunuz sadece sona erecek. Buraya bakın: http://msdn.microsoft.com/en-us/library/system.windows.forms.application.run.aspx

Ayrıca, sigara modally göster herhangi formlar birbirini blok yok, birden fazla pencere var sağlayacak olan ana formuyla birlikte çalışmaya devam edecek. Bunun başarmak için ne çalışıyorsunuz aslında olduğuna inanıyoruz.

Cevap 05/08/2008 saat 22:45
kaynak kullanıcı

oy
0

Ancak ben o zaman yerine Application.Run ait () yeni sadece formu newing tarafından bir konsol uygulamasından pencere formları çalıştığını ve bileşenleri olduğunu kullanırsanız, üzerinde newForm.Show () çağırarak hatırlıyorum, bu doğru olup olmadığından emin değilim bir şekilde bloke etmemelidir.

Tabii bileşeni oluşturduğu formları başvuru bakımından sorumlu olacak

Cevap 23/05/2009 saat 22:57
kaynak kullanıcı

oy
0

Ben Yeterince ona kesmek eğer bu mümkün eminim, ama bunun iyi bir fikir değildir öneririm.

'Windows' (Ekranda gördüğünüz o) yüksek süreçlere birleştirilmiştir. Bu ekran yeniden çizme', herhangi bir GUI (gibi şeyler, 'düğmesine tıklandığında' 'uygulamasını kapalı' oluşturma ve pencereleri yönetmek ile katılan tüm iletileri işler Mesaj Döngü, sahip olması bekleniyor görüntüler her süreçtir ' ve bunun gibi.

Bu nedenle, daha fazla ya da daha az herhangi bir ileti döngüsü varsa, bu sürecin ömrü boyunca mevcut olmalıdır varsayılmaktadır. örnek pencereleri size bir 'çıkın' mesajını gönderebilir ve size ekranda şeyim yok bile, o işlemek için kullanılabilir bir ileti döngüsü olması gerekir için.

Yapabileceğiniz en iyi şey böyle yapmak geçerli:

'ana uygulama' olan, hiçbir zaman sahte formu olun Çağrı Application.Run başlatın ve bu sahte formda geçmektedir. Eğer Gui şeyler yapmanız gerektiğinde ana iş parçacığı adresinden başka bir iş parçacığı çalışmalarını ve yangın olayları yapın.

Cevap 06/08/2008 saat 00:22
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more