Problém s časovačem – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Problém s časovačem – .NET – Fórum – Programujte.comProblém s časovačem – .NET – Fórum – Programujte.com

 

paashi0
Super člen
27. 10. 2007   #1
-
0
-

Nevím proč, dělám, co je v mých silách, ale bez kloudného výsledku. Mám program se sériovým portem. Vysílám data v pravidelných intervalech (jedním časovačem), přijímám data a kontroluju je (CRC, apod.). Na statistické účely a na kontrolu spojení jsem zřídil druhý časovač, který měří timeout. Logika je prostá: na tik hlavního časovače odešlu data, zároveň zastavím hlavní časovač a spustím časovač timeoutu. V události přijetí dat na portu, po jejich kontrole, zastavím timeout a spustím hlavní časovač. Problém je v tom, že se mi nedaří spustit časovač správně, protože ho spouštím z vlákna sériového portu a jeho handler se nepřihlásí, tj. jako by neměl handler, tzn. další odeslání dat už nenastane. Zkusil jsem to přes události, ale ani tak to nejde. Můj poslední pokus ve zkratce uvádím níže. Dotaz tedy zní: jak správně ovládat časovač z jiného vlákna?



//Delegates and events
delegate void StopTimeoutDelegate(System::Object^ sender, EventArgs^ e);
public: event StopTimeoutDelegate^ StopTimeout;
delegate void StartTimeoutDelegate(System::Object^ sender, EventArgs^ e);
public: event StartTimeoutDelegate^ StartTimeout;

//private: System::Void timerMain_Tick(System::Object^ sender, EventArgs^ e)
{
//Něco jako serialPort1->Send(data)
//Spuštění timeoutu
StartTimeout(this, e);
}

//private: System::Void timerTimeout_Tick(System::Object^ sender, EventArgs^ e)
{
StopTimeout(this, e);
}
//serialPort handler při přijetí dat
private: System::Void serialPortDataRecieved(System::Object^ sender, System::IO::Ports::SerialDataReceivedEventArgs^ e)
{
//Načtení dat do bufferu (globálního)

Thread^ Recieve = gcnew Thread(gcnew ThreadStart(this, &Form1::RecieveThread));
Recieve->Start();
}
//Vlákno pro kontrolu dat
private: System::Void RecieveThread()
{
//Kontrola CRC v bufferu
if(CRCCheck())
{
EventArgs^ ea = gcnew EventArgs();
StopTimeout(this, ea);
}
}
//Handler pro zastavení timeoutu a spuštění hlavního časovače
private: void StopTimeoutEventHandler(System::Object^ sender, EventArgs^ e)
{
timerTimeout->Stop();
timerMain->Start();
}
//Handler pro spuštění timeoutu a zastavení hlavního časovače
private: void StartTimeoutEventHandler(System::Object^ sender, EventArgs^ e)
{
timerMain->Stop();
timerTimeout->Start();
}


Vše funguje až do chvíle, kdy v pořádku přijmu a zkontroluju data. V případě chyby CRC nebo bez odpovědi se střídají hlavní časovač s časovačem timeoutu.

Nahlásit jako SPAM
IP: 84.47.109.–
Ajem tíčr, andrgraund tíčr!
DeaLer+2
Hero
27. 10. 2007   #2
-
0
-
Nahlásit jako SPAM
IP: 84.21.124.–
Dušan Janošík | web: djanosik.cz, @djanosik
paashi0
Super člen
28. 10. 2007   #3
-
0
-

To DeaLer :
Tak jsem hledal, ale našel jsem jen doporučení použít jiný časovač, např. z Threading. Uvidím, vyzkouším....

Nahlásit jako SPAM
IP: 84.47.109.–
Ajem tíčr, andrgraund tíčr!
paashi0
Super člen
28. 10. 2007   #4
-
0
-

Tak jsem našel odpověď v databázi msdn. Mělo by se použít BeginInvoke(), v podstatě by se mělo používat pokaždé, kdy není jistota o umístění metody ve vláknech. Trošku mě tu mate ten jednosouborový model (vše ve Form1.h) a komponenty, které využívají svoje vlákno. Docela alchymie.

Nahlásit jako SPAM
IP: 84.47.109.–
Ajem tíčr, andrgraund tíčr!
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, 40 hostů

Podobná vlákna

Problem s < a > — založil 7raul

Problém — založil Dfire

Problém — založil Ma.ty

Problém v C++ — založil Anonim

 

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