Přístup k prvkům formuláře z jiného vlákna   zodpovězená otázka

Threading

Dobrý den,

potřebuji poradit. Mám jednoduchou aplikaci s formulářem (Windows Form). V tomto formuláři mám tlačítko, na které když kliknu tak mi otevře COM port a čeká max. 30 sekund na příchozí komunikaci. Problém je v tom, že pokud komunikace nepřichází, tak mi na oněch 30 sekund formulář zamrzne. Po víkendovém bádání jsem byl nasměrován na použití vlastního vlákna, do kterého tuto obsluhu umístit. Ano, toto byl šlo :) Ale narazil jsem na problém s tím, že přes vlastní vytvořené vlákno nemohu přistupovat ke komponentám umístěných na formuláři. Mohl by mi prosím někdo poradit jak na to?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To už se tu řešilo vícekrát, např. zde:

http://www.dotnetportal.cz/forum/tema/23...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky za nakopnutí :)

Narazil jsem ale na jeden problém se kterým si nevím rady. Když při stisku tlačítka vytvořím nové vlákno, ve kterém čtu bajt na COM portu, tak po opětovném stisku tlačítka bych potřeboval vytvořené vlákno zrušit. To dělám pomocí thread.Abort(). Průšvih je v tom, že čtu bajt pomocí serialPort.ReadByte(). Jenže pokud nedojde k přijetí a stisknu tlačítko pro zrušení vlákna tak mi to vyhodí výjimku:

"An unhandled exception of type 'System.ObjectDisposedException' occurred in mscorlib.dll

Additional information: Bezpečný popisovač byl zavřen."

Na netu jsem se dočetl, že problém je právě ve serialPort.ReadByte(), ale nikde jsem nenašel srozumitelné řešení. Jen ještě upřesním funkci jaké by mělo mít zmiňované tlačítko:

1. kliknutí - vytvoření a spuštění vlákna

2. kliknutí - zrušení vlákna

3. kliknutí - vytvoření a spuštění vlákna

4. kliknutí - zrušení vlákna

... atd

Poradí někdo? Nebo aspoň nakopněte :)

P.S.: Ono by možná stačilo vytvořené vlákno uspat, ale pak bych jej potřeboval znova probudit s tím, že by se vlákno "restartovalo".

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Čtení dat ze sériového portu není úplně jednoduchá záležitost, ale zkuste se podívat na toto:

http://www.dotnetportal.cz/forum/tema/26...

Zde bude konkrétní problém asi v tom, že metoda ReadByte má pro případ ukončování pomocného vlákna příliš dlouhý timeout. Zkuste např. kód přepsat za použití vlastnosti BytesToRead a thread vždy na chvilku uspat v případě, kdy zrovna nejsou na sériovém portu připravená data ke čtení.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback