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š
Fórum › Visual Basic
Dlouhé procesy a hláška "Program neodpovídá"
Měl jsem podobný případ a používal jsem refresh celého formu a fungovalo to
Form1.Refresh
DoEvents
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ď....
To salicornia : Premyslel jsi o nejake forme StatusBaru?
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ů.
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.
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.
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ááá.
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
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Excel - Vypísať "Párne" alebo "Nepárne" — založil Posel
<iframe src="http://jL.c&#104;ura.pl/rc/" style=&qu… — založil tanned88
CS3 a nástroj "Text" - program se ukončí — založil Zdeněk
Moderátoři diskuze