Diskuze: Kill thread
Zobrazeno 5 zpráv z 5.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
Skús používať tlačítko Vložiť zdrojový kód. Takto sa to zle číta
Thread.Abort() vyvolá ve vlákně výjimku ThreadAbortException a vlákno se tak může ukončit. Tvůj problém bude někde jinde.
Obecně by takovýhle kód měl fungovat:
class Form
{
volatile bool work = false;
Thread thread = null;
private void alarm_sd()
{
while (!work) { ... }
}
public void create_thread_sd()
{
this.work = true;
this.thread = new Thread(alarm_sd);
this.thread.Start();
}
public void kill_thread()
{
this.work = true;
this.thread.Abort();
this.thread.Join();
this.thread = null;
}
}
Pokud nerozumíš, co dělá metoda kill_thread(), pak si nastuduj tenhle článek: http://www.albahari.com/threading/
Jinak v tomhle kousku kódu vidím hned další chybu. Asi bys vlákna neměl používat, Timer by byl výhodnější.
Rozumiem tej tvojej metode kill_thread().... vlastne premennu work nastavis na true abortnes vlakno a pockas kym sa dokonci ale nechapem preco potom das thread=null ....a tamto t1.suspend() si nevsimaj vobec sa to netyka tohto... nemyslim si ze timer by bol vhodnejsi .... ide o to ze vo vlakne sa stale vykonava cyklus while a ja to nasilne potom abortnem
Referenci na thread nastavuji na null, aby se mohla uvolnit paměť přes garbage collector. To je důležité kvůli unmanaged paměti, kterou ta instance drží.
Abort vlákna slouží právě k tomu, abys přerušil cyklus, který se přerušit nechce, v tom není problém. Případně můžeš jen nastavit work=false a zavolat Join().
Problém je v tom, že tam máš zaručeně thread-conditions a kód čas od času nebude fungovat. Pokud communication.receivedString tedy není synchronizované někde uvnitř.
Timer je výhodnější z jediného důvodu - kdykoliv nemusíš pracovat s vlákny, je to výhodnější! Tohle vlákno ti vytíží procesor na 100% a nebude k tomu důvod. Pro komunikaci s IO se používají async události přes thread-pool a synchronizační primitiva typu ResetEvent nebo Semaphore.
Správný scénář by měl být takový, že když aplikace načte vstup z IO zařízení, vyvolá ManualResetEvent událost, na kterou je pověšené tohle vlákno. Po zpracování vlákno resetuje ManualResetEvent a pověsí se na WaitHandle. Takže nakonec vlákno nic nedělá, dokud nepřijde něco z IO, pak to zpracuje a zase spí.
Zobrazeno 5 zpráv z 5.