Dlouhé procesy a hláška "Program neodpovídá" – Visual Basic – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Dlouhé procesy a hláška "Program neodpovídá" – Visual Basic – Fórum – Programujte.comDlouhé procesy a hláška "Program neodpovídá" – Visual Basic – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
21. 1. 2008   #1
-
0
-

Mám celkem složitý program ve VB, který používá rozsáhlé matice dat, a na ně aplikuje složité výpočty. Ty mohou trvat od několika minut do několika hodin. Takovýchto výpočtových rutin je v programu nespočet. Program je používán značným množstvím lidí, takže řešení problému se nedá jednoduše obejít. A teď k problému samotnému, který se mi nepodařilo vyřešit. Pokud zatížím procesor na delší dobu výpočtem, přestane odpovídat program na vnější impulzy (kliknutí, klávesa) a zdánlivě zatuhne. Vypisuje ve Windows okno 'Program neodpovídá'. Toto zatuhnutí je jen zdánlivé, protože procesy probíhají dál do úspěšného konce, ale uživatelé mají pocit, že je to v... a program předčasně ukončí (a samozřejmě dost u toho nadávají). Lze proti tomu něco dělat? Existuje nějaká API rutina, která běh programu na chviličku přeruší a obnoví jeho životní funkce navenek? (např. překreslí lištu procesu nebo něco jiného, aby byl vidět pokrok). Obnovné procesy aplikované ve formuláři (Refresh) samozřejmě všude mám, ale tohle nepomáhá. Nejsem schopen vymyslet způsob, jak tohle obejít, aniž bych významně zpomalil průběh výpočtu, a současně aby zásah do kódu byl co nejmenší. Prosím, pokud by někdo věděl, poraďte. Díky. Luboš

Nahlásit jako SPAM
IP: 147.251.34.–
Reklama
Reklama
jkonopasek0
Návštěvník
22. 1. 2008   #2
-
0
-

Měl jsem podobný případ a používal jsem refresh celého formu a fungovalo to

Form1.Refresh
DoEvents

Nahlásit jako SPAM
IP: 88.101.222.–
maty0
Návštěvník
22. 1. 2008   #3
-
0
-

nebo DoCmd.RepaintObject acForm, myform

Nahlásit jako SPAM
IP: 194.213.57.–
1 nebo 0 toť otázka
maty0
Návštěvník
22. 1. 2008   #4
-
0
-

jo sorry tohle je z accessu takže nevim jak v případném vb6 a výše

Nahlásit jako SPAM
IP: 194.213.57.–
1 nebo 0 toť otázka
Tocimanko0
Grafoman
22. 1. 2008   #5
-
0
-

Hmm, nedalo by sa to riešiť pomocou vlákien?

Nahlásit jako SPAM
IP: 195.91.54.–
Freelance copywriter
(web copywriting, sales letters, PR articles)
http://blog.tociman.net
22. 1. 2008   #6
-
0
-

Díky za odpovědi, form1.refresh samozřejmě funguje a já to v programu všude mám, ale jen do chvíle, kdy se Windows na celé to okno vyprdnou a věnují se procesu. Pak už je mi to nahouby. Myslím, že podobný problém nastává například tehdy, jestliže ve Wordu chcete uložit třeba 100 MB velký soubor (nebo při automatické záloze). Celé okno zamrzne a věnuje se ukládání. Když do něj kliknete, objeví se (ve Vistách) kroužek, okno zešedne a jste namydlení. Je potřeba počkat třeba dvě minuty, než se soubor uloží. Není vidět žádný průběh ukládání, nic. Máte prostě pocit, že program už to nerozchodí...
Pomocí vláken? To mi nic neříká. Prosím, nahoď....

Nahlásit jako SPAM
IP: 147.251.34.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
22. 1. 2008   #7
-
0
-

To salicornia : Premyslel jsi o nejake forme StatusBaru?

Nahlásit jako SPAM
IP: 89.176.108.–
JaFi
~ Anonymní uživatel
2 příspěvky
23. 1. 2008   #8
-
0
-

Protože tvá alikace v růběhu býpočtu nemá čas na zracování zpráv, zdánlivě vytuhne.
Jedna možnost - občas - rozhodně ne v každé iteraci cyklu vynutit zpracování zpráv. Ve VB by to mohlo být DoEvents. To stačí asi jednou za sekundu, takže např. každou 10 000-cí iteraci
Druhá možnost je přenést zpracování do zvláštního vlákna, ale nevím, jak je na tom VB s podporou threadů.

Nahlásit jako SPAM
IP: 194.213.41.–
jkonopasek0
Návštěvník
23. 1. 2008   #9
-
0
-

Pokud není možné do procesu vložit refresh formu, pak bych nadefinoval Timer s vybraným časem (třeba 10 s), při spuštění procesu dal Timer1.Enabled=True, po ukončení procesu ho dal False. V Timeru by byl příkaz pro Form1.Refresh a DoEvents. Nechce se mi věřit, že by tohle nefungovalo, samozřejmě nesmíš opustit formulář s Timer.

Nahlásit jako SPAM
IP: 88.101.222.–
tommz90
Stálý člen
23. 1. 2008   #10
-
0
-

Já bych to řešil pomocí vláken.

http://en.wikipedia.org/wiki/Thread_%28computer_science%29

spustíš výpočtové vlákno, které poběží nezávisle na GUI. Tzn. že v GUI můžeš vypisovat nějaký status bar, poskytnout tlačítka pro pozastavení - přerušení procesu atd. Také můžeš umožnit práci na různých výpočtech najednou (pokud je v počítači více procesorů) atd.

Nahlásit jako SPAM
IP: 82.209.19.–
23. 1. 2008   #11
-
0
-

Moc vám děkuji, je to nesmírně primitivní, takže se omlouvám za svoji hloupost. Pokud vytvořím formulář, dám do něj label a tlačítko a k němu přiřadím:
Private Sub Command1_Click()
l = 0
For i = 1 To 1000
For j = 1 To 1000
For k = 1 To 1000
l = l + 1
Label1.Refresh
Next k
Form1.Refresh
'neaktivní DoEvents
Next j
Next i
End Sub
po chvíli nebo několikerým kliknutím do formuláře okno zatuhne. Pokud dám DoEvents aktivně do algoritmu, funkce okna se oživí. Hurááá.

Nahlásit jako SPAM
IP: 89.24.4.–
maty0
Návštěvník
23. 1. 2008   #12
-
0
-

To salicornia : kristova noho, co to je za blbou smyčku, jaký to má efekt???????

Nahlásit jako SPAM
IP: 194.213.57.–
1 nebo 0 toť otázka
JaFi
~ Anonymní uživatel
2 příspěvky
24. 1. 2008   #13
-
0
-

Ta smycka se dela jinak, pokud tam pravdu nepotrebujes 3 promenne v cyklu

For i = 1 to 1000000
if i MOD 10000 = 0 ' tady si uprav funkci na zbytek po celociselnem deleni do VB
DoEvents
' tady jsou nejake vypocty
Next i

Nahlásit jako SPAM
IP: 194.213.41.–
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, 22 hostů

Moderátoři diskuze

 

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