Proč funkce zamrzá? – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Proč funkce zamrzá? – .NET – Fórum – Programujte.comProč funkce zamrzá? – .NET – Fórum – Programujte.com

 

Mutagen0
Super člen
14. 9. 2014   #1
-
0
-

Zdravím,

Nevíte proč mi zamrzá program i když mám funkci puštěnou v novým threadu?

private void Install()
        {
            getLabelPercent.Invoke(new Action(() => getLabelPercent.Text = "Instaluji ..."));
            Core.Unrar unrar = new Core.Unrar();
            String zip = @"" + Path.GetDirectoryName(Application.ExecutablePath) + "\\tmp\\" + getFileName;
            getLabelPercent.Invoke(new Action(() => getLabelPercent.Text = unrar.Extract(zip, Core.PublicVariable.UltimaOnlinePath, getProgress, getLabelPercent, setAddText)));
        }

Takhle pouštím

Thread newThread = new Thread(Install);
newThread.Start();
Core.Registry.add2Registry("Path", Core.PublicVariable.UltimaOnlinePath);

A Unrar vypadá takto

public String Extract(String file, String destination)
        {
            var archive = ArchiveFactory.Open(file);
            pBar.Invoke(new Action(() => pBar.Maximum = archive.Entries.Count()));
            foreach(var entry in archive.Entries)
            {
                entry.WriteToDirectory(destination, ExtractOptions.ExtractFullPath | ExtractOptions.Overwrite);
                rtb.Invoke(new Action(() => rtb.AppendText(entry.FilePath + Environment.NewLine)));
                rtb.Invoke(new Action(() => rtb.Select(rtb.Text.Length, 1)));
                pBar.Invoke(new Action(() => pBar.PerformStep()));
            }
            return "Nainstalováno ...";
        }

Nenechte se zmát počtem parametrů tohle je přímo funkce pro unrar, tamta je přímo pro nastavení komponentu aa následně spuštění této.

A ten nový thread puštím v události při kompletním stáhnutí souboru.

Nahlásit jako SPAM
IP: 89.190.90.–
Matěj Andrle+1
Grafoman
14. 9. 2014   #2
-
0
-

#1 Mutagen
Původní kód nesmí běžet v hlavním vláknu. Tedy musí to být 2 vlákna z hlavního. Namísto toho, abys měl v hlavním vytvoření dítěte, které se stará o Install... (Tak bude moci běžet hlavní vlákno nepřetržitě - takto fungují i démoni - na eventy reagují vytvářením dětí, které se o ně postarají.) A samozřejmě to chce vhodně použít lock, delegáty atp.

Nahlásit jako SPAM
IP: 78.136.166.–
Mutagen0
Super člen
14. 9. 2014   #3
-
0
-

#2 Matěj Andrle
Takže když v eventu vytvářím novej thread tak to nebere jako nový vlákno mám chápat? jednoušeji, mám form kde mám event a v něm pouštím nové vlákno. To se jako nové vlákno nebere? vím, že se má používat lock ale když to spouštím jen jednou tak není potřeba.

Co jsi myslel tím, 2 vlákna z hlavního? :O

Nahlásit jako SPAM
IP: 89.190.90.–
Matěj Andrle+1
Grafoman
14. 9. 2014   #4
-
0
-

#3 Mutagen
Ne - jde o to, že vlákno nemůže běžet samo! V Linuxu lze předávat vlákna prvotnímu procesu - init. Ovšem ve Windos, tuším, nic takového nejde. Nedal jsi celý kód, pročež ti nemám jak více pomoci. Nenapadá mne, jak ti to vysvětlit bez kódu... :D

Nahlásit jako SPAM
IP: 78.136.166.–
Mutagen0
Super člen
14. 9. 2014   #5
-
0
-

#4 Matěj Andrle
Otázka, na co celý kod, když to co jsem poslal je ta čast ke mě to zamrzá a napsal jsem jak to spouštím? ... Jak víc to vysvětlit? To, že napíšu, že ve Formm mám event kterej když se uskuteční pouštím novej thread a v tom ten kod co jsem poslal tak nevím na co víc bys potřeboval víc kodu? To je tak nesrozumitelný tohle? Nebo těžký na pochopení?

Nahlásit jako SPAM
IP: 89.190.90.–
Matěj Andrle+1
Grafoman
14. 9. 2014   #6
-
0
-

#5 Mutagen
Pouštíš nové dítě a to dítě ti působí na hlavní thread - tak pardon, že chci změnit schéma programu... Snažím se pomoci a nedáváš mi k tomu moc důvodů. V hlavním vláknu zkrátka nemáš mít Form! V hlavním vláknu máš mít centrum - které vytvoří dítě pro Form a dítě pro Install - co na tom nechápeš? (Kdybych viděl kód, udělal bych ti fungující schéma rovnou - takto neposloužím.)

Nahlásit jako SPAM
IP: 78.136.166.–
Mutagen0
Super člen
14. 9. 2014   #7
-
0
-

#6 Matěj Andrle
Chci poradit nějakým examplem, né aby to někdo udělal za mě. Takhle se pak nic nenaučím novýho. Ale zvlíštní je, že dřív mi to problem nedělalo. Když jsem pustil nový thread tak mi program nezamrzal, dělá mi to jen u tohoto. Takže se asi zeptám pro tebe jinak, jak ddocílím když chci pustit thread ve Form aby mě form nezamrznul?

Nahlásit jako SPAM
IP: 89.190.90.–
Matěj Andrle+1
Grafoman
14. 9. 2014   #8
-
0
-

#7 Mutagen
Znovu - toto dítě zkrátka působí na hlavní vlákno! Takže Application.Run zkrátka pusť v dítěti a v jiném pak práci s archivy - nebo která část ti to dělá... Zkrátka to separovat. Nejde o to, že bych to udělal za tebe, ale že bych neplácal výstřely a hned přesně věděl co jak a proč - a navrhl ti schéma - nic víc... Jen neumím vařit z vody. Toto je pouze můj nápad - netuším, zda může onen kód narušovat chod své matky. Třeba ne - ale to se nedozvím, když si to nespustím... :D

Nahlásit jako SPAM
IP: 78.136.166.–
Mutagen0
Super člen
14. 9. 2014   #9
-
0
-

#8 Matěj Andrle
Ale to snad není problem ne? Když mě to dřív normálně takhle šlo, že mi form nezamrzal u jiných programů ... Právě proto se divím.

Nahlásit jako SPAM
IP: 89.190.90.–
Matěj Andrle+1
Grafoman
14. 9. 2014   #10
-
0
-

#9 Mutagen
Ach jo - můj odhad je, že je to archivátorem - že působí na hlavní thread. Více, než odhady ti nedám. Ne, když mě nenecháš zjistit příčinu. Když mě necháš ji zjistit, snadno ti vysvětlím proč... :D Ono to totiž ani nemusí být vláknem!

Nahlásit jako SPAM
IP: 78.136.166.–
p3can
~ Anonymní uživatel
312 příspěvků
14. 9. 2014   #11
-
0
-

vubec nevim co tu resite kdyz chyba je tady


getLabelPercent.Invoke(new Action(() => getLabelPercent.Text = unrar.Extract(zip, Core.PublicVariable.UltimaOnlinePath, getProgress, getLabelPercent, setAddText)));
 

celou metodu Extract si spustil pomoci invoke na GUI vlakne.

Nahlásit jako SPAM
IP: 77.92.213.–
Mutagen0
Super člen
14. 9. 2014   #12
-
0
-

#11 p3can
No já nevím co tu řeší, Jak to mám porsímtě teda spustit? Dík

Nahlásit jako SPAM
IP: 89.190.90.–
Matěj Andrle+1
Grafoman
14. 9. 2014   #13
-
0
-

#11 p3can
"Ono to totiž ani nemusí být vláknem!"

Však já hned poznal špatný návrh - neoddělení grafiky atd. Návrh schématu odmítl - tak ať se topí... :D

Nahlásit jako SPAM
IP: 78.136.166.–
p3can
~ Anonymní uživatel
312 příspěvků
14. 9. 2014   #14
-
0
-

   

var pom=unrar.Extract(zip, Core.PublicVariable.UltimaOnlinePath, getProgress, getLabelPercent, setAddText);
getLabelPercent.Invoke(new Action(() => getLabelPercent.Text = pom ));
Nahlásit jako SPAM
IP: 77.92.213.–
Mutagen0
Super člen
14. 9. 2014   #15
-
0
-

#14 p3can
Díky moc.

Nahlásit jako SPAM
IP: 89.190.90.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 18 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý