Diskuze: Kill thread
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 5 zpráv z 5.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.


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.