Jak uz tu padlo, je to problem s krizenim vlaken. Komponenty, domnivam se, ze zejmena deklarovane s WithEvents, jsou vytvoreny "v ramci" nejakeho vlakna a mohou v ramci tohoto vlakna vykonavat nejakou cinost (interni funkcionalita a vyhazovani udalosti musi zrat cas nejakeho vlakna). Jakmile zacnu po komponente neco chtit a pohybuju se v jinem vlakne (treba obsluha timeru, volani z nejake jine casti programu s vlastnim vlaknem a podobne), muzu zpusobit problem - bude se treba zapisovat do mista, ze ktereho se prave cte, a zpusobit nejakou nekoznistenci atd atd atd .... Problem se komponentou SerialPort je, ze pokud si ji naklikate do formulare, bude vytvarena v ramci formulare pomoci GUI vlakna. Reseni (teoreticky) ... vice se zabejvat vlaknama a mit prehled o tom co se kde vytvari a rozdelit program na oddelene casti (gui, data, io). Pak se bude hodit i prace s delegatama a tady uz zminovanym "invoke" - umoznuje vyvolat udalost/volani v ramci jineho vlakna. A pro operace, ktere mohou probihat nekde na pozadi, se hodi Background Worker (bezi si potichu ve vlastnim vlakne...takze by mohl treba samostatne zpracovat i veci kolem serioveho portu, atd atd).
|