Diskuze: Popisovač okna aneb problém s vykreslením prvků

C# .NET .NET (C# a Visual Basic) Popisovač okna aneb problém s vykreslením prvků American English version English version

Avatar
jackxl
Člen
Avatar
jackxl:

Zdar.
Co je to popisovač okna ?
To je přece normálně MainWindowHandle, ne ?
Mám problém s tím, že když zavolám otevření formuláře a za voláním formuláře je nějaká časově náročná akce, tak se prvky na tom formuláři nevykreslí. Zkoušel jsem to i přes asynchronní metody a asynchronní časovač, ale to právě hlásí chybu s "Popisovačem okna".
Uvedu kód jako příklad, kde se ten problém objevuje:

public partial class Form1 : Form
    {
        Form ff1, ff2;
        ProgressBar prog;
        public Form1()
        {
            InitializeComponent();
            prog = new ProgressBar();
            prog.Style = ProgressBarStyle.Marquee;
            this.Location = new Point(100, 100);
            ff1 = new Form();
            ff1.Text = "Form 2";
            ff1.Location = new Point(200, 200);
            ff1.Load +=new EventHandler(ff1_Load);
            ff2 = new Form();
            ff2.Text = "Form 3";
            ff2.Location = new Point(300, 300);
            prog.Location = new Point(10, 10);
            prog.Size = new System.Drawing.Size(200, 50);
            prog.Parent = ff1;
            ff1.Show();
            Thread.Sleep(10000);

        }

        private void ff1_Load(object sender, EventArgs e)
        {
            ff2.Show();
        }

    }

Thread.Sleep(10000) simuluje časově náročnou akci

Odpovědět 14.10.2015 19:54
Žádná hranice není nepřekonatelná.
Avatar
Odpovídá na jackxl
Michal Štěpánek:

Na ty náročnější operace zkus použít BackgroundWorker

Nahoru Odpovědět 14.10.2015 22:25
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
jackxl
Člen
Avatar
Odpovídá na Michal Štěpánek
jackxl:

Co jsem zkusil:

  1. Použít BackgroundWorker na náročnou operaci -> bez výsledku, problém přetrvává
  2. Umístění náročné operace do jiného vlákna -> bez výsledku, problém přetrvává
  3. Asynchronní časovač -> bez výsledku, problém přetrvává
  4. Asynchronní metody -> bez výsledku, problém přetrvává
  5. Paralelní přístup přes TPL -> bez výsledku, problém přetrvává

Opravdu nevím kde je problém, ale vypadá to, že se nedokončí inicializace komponent formuláře.
V konzolových aplikacích jsem to nezkoušel, ale myslím že tam se toto neděje.

Editováno 15.10.2015 7:53
Nahoru Odpovědět 15.10.2015 7:52
Žádná hranice není nepřekonatelná.
Avatar
Milan Křepelka
Redaktor
Avatar
Milan Křepelka:
  1. Proč jsou ff1, ff2 typu Form. To by mají být nějací potomci, ne?
  2. Volat ff1.Show(); v kontruktoru, je jasně nedobře, to bych odsunul na později
Editováno 15.10.2015 8:32
 
Nahoru Odpovědět 15.10.2015 8:32
Avatar
jackxl
Člen
Avatar
Odpovídá na Milan Křepelka
jackxl:

To byl jen příklad. Proč by to měly být potomci, když chceš vyvolat formuláře s jinými prvky ?
Normálně zavolám vyvolání formuláře s progressBarem v události Load.
Vyvolaný formulář slouží jen pro zobrazení, že se data stále načítají nebo zpracovávají.

Každopádně za Show následuje časově náročná akce a prvky na tom vyvolaném formuláři se nezobrazí.
Zkusil jsem nově dát jenom Thread.Sleep do BackgroudWorkeru a prvky se pak vykreslí.
Když do BackgroudWorkeru dám moji náročnou funkci (dále jen nacteniDat), tak se nevykreslí.
Blokuje to tedy asi moje funkce, ale pořád nevím kde a jak, protože žádné blokování vláken apod tam není.
Funkce nacitaniDat dělá jenom načítání dat ze souboru a jejich zpracování za použití reflexe.

Nahoru Odpovědět 15.10.2015 9:24
Žádná hranice není nepřekonatelná.
Avatar
Milan Křepelka
Redaktor
Avatar
Milan Křepelka:

Jak jsem psal, dělat to v kontruktoru není dobrý nápad. Jelikož toto kolo bylo již dávno objevené, žel bych cestou inspirace od ostatních. Na .NETu najde spoustu zajímavých samplíků. Třeba tady

http://www.codeproject.com/…rting-Cancel

 
Nahoru Odpovědět  +2 15.10.2015 9:36
Avatar
jackxl
Člen
Avatar
Odpovídá na Milan Křepelka
jackxl:

Ale toto už jsem zkoušel taky a nešlo to.

Už jsem to ale vyřešil.
Zapomněl jsem ve funkci nějaké prvky jiného formuláře a dělal to Invoke.
Po odstranění těchto prvků už to funguje.

Akceptované řešení
+5 Zkušeností
Řešení problému
Nahoru Odpovědět 15.10.2015 10:49
Žádná hranice není nepřekonatelná.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.