<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=48&amp;t=10872&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-03-04T14:51:24+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=48&amp;t=10872&amp;mode</id>
<entry>
<author><name><![CDATA[grzechupk]]></name></author>
<updated>2015-03-04T12:31:14+01:00</updated>
<published>2015-03-04T12:31:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10872&amp;p=121893#p121893</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10872&amp;p=121893#p121893"/>
<title type="html"><![CDATA[Re: Thread vs Timer]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10872&amp;p=121893#p121893"><![CDATA[
Z tego co się orientuję to jest to tak zwane wyrażenie lambda ( =&gt; ). Po lewej stronie umieszczamy argumenty (u nas ich brak, dlatego są puste nawiasy), a po prawej instrukcję do wykonania. To jest pewnie zrobione po to, żeby można było wywoływać dowolną funkcję z dowolną liczbą argumentów i o dowolnych typach. W przeciwnym wypadku Task.Run oczekiwałaby jakiegoś konkretnego typu funkcji (np int func(char c)), a tak oczekuje tzw akcji (jakiegos wyrazenia lambda) i jest to bardzo uniwersalne. Dla nas to tylko zwykłe przekazanie callbacka do wywołania <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Od razu dodam, że zajmuję się tym amatorsko i niezbyt długo, dlatego w razie czego proszę o poprawienie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Tutaj trochę informacji: <!-- m --><a class="postlink" href="https://msdn.microsoft.com/pl-pl/library/bb397687.aspx" >https://msdn.microsoft.com/pl-pl/library/bb397687.aspx</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2400">grzechupk</a> — 4 mar 2015, o 12:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[grzechupk]]></name></author>
<updated>2015-03-04T14:51:24+01:00</updated>
<published>2015-03-03T02:28:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10872&amp;p=121714#p121714</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10872&amp;p=121714#p121714"/>
<title type="html"><![CDATA[Re: Thread vs Timer]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10872&amp;p=121714#p121714"><![CDATA[
W .NET Framework 4.5 dodali bardzo fajne rozwiązanie na programowanie asynchroniczne: <!-- m --><a class="postlink" href="https://msdn.microsoft.com/pl-pl/library/hh191443.aspx" >https://msdn.microsoft.com/pl-pl/library/hh191443.aspx</a><!-- m --><br />Ja ostatnio zacząłem robić tak:<br />1) Tworzę sobie &quot;funkcję timerową&quot; (ta jest niepraktyczna, co sekundę wysyła do wszystkich tę samą wiadomość <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ):<br />[syntax=csharp]private async Task GameAsync()<br />        {<br />            while(true)<br />            {<br />                ServerSendToAll(MessageType.BeginGame, &quot;Toczy się gra&quot;);<br />                await Task.Delay(1000);<br />            }<br />        }[/syntax]<br />2) W momencie, kiedy potrzebuję włączyć swój &quot;timer&quot; umieszczam w kodzie:<br />[syntax=csharp]Task.Run(() =&gt; GameAsync());[/syntax]<br />A działa to mniej więcej tak:<br />1) Funkcja GameAsync() od momentu odpalenia poleceniem Task.Run() będzie działała w kółko, ponieważ wewnątrz niej jest nieskończona pętla.<br />2) Najpierw funkcja wywoła inną funkcję, w tym wypadku ServerSendToAll(...)<br />3) Kiedy już tamta się wykona, nastąpi wyście z funkcji GameAsync() i mogą się wykonywać inne operacje. <br />4) Kiedy odliczanie dobiegnie końca (dba o to słówko await) program wróci do wnętrza funkcji GameAsync() i kontynuuje swoje działanie, czyli tutaj nastąpi kolejne przejście funkcji. Znowu wyśle wiadomośc do wszystkich, zacznie czekać, wyjdzie z tej funkcji żeby dać innym swobodę działania, i wróci dopiero kiedy Task.Delay(int d) się skończy. I tak w kółko.<br /><br />Coś czuję, że moje tłumaczenie jest dość marne, ale naprawdę warto zainteresować się tym tematem. Być może mój przykład jest nienajlepszy, ale te nowości można z powodzeniem stosować do innych potrzeb, takich jak czekanie na zapis do pliku czy na odpowiedź serwera HTTP. Przy okazji chciałbym się dowiedzieć, czy takie podejście (ten konkretny przykład) jest w miarę OK.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2400">grzechupk</a> — 3 mar 2015, o 02:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2015-03-02T12:46:15+01:00</updated>
<published>2015-03-02T12:46:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10872&amp;p=121609#p121609</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10872&amp;p=121609#p121609"/>
<title type="html"><![CDATA[Re: Thread vs Timer]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10872&amp;p=121609#p121609"><![CDATA[
Ja dam drugi przykład z życia, jak masz wiele połączeń, np. z czujników, urządzeń. TO absolutnie nie radzę, usypiać wątków, np. by zrobić jakieś opóźnienie komunikatu zwrotnego whatever <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br />Przy kilku uśpionych wątkach, jeszcze jest ok, ale przy 20-30stu, potrafi się zawiesić nawet komp z 2 rdzeniowym intelem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<p>Statystyki: Napisane przez Gość — 2 mar 2015, o 12:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[j23]]></name></author>
<updated>2015-03-01T22:48:08+01:00</updated>
<published>2015-03-01T22:48:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10872&amp;p=121560#p121560</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10872&amp;p=121560#p121560"/>
<title type="html"><![CDATA[Re: Thread vs Timer]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10872&amp;p=121560#p121560"><![CDATA[
Ja odpowiem w największym skrócie i najprościej jak tylko potrafię. Przede wszystkim wewnątrz funkcji Thread (gdzie odpalamy wątek) może być jakiś timer/timer'y. Po drugie timer/timer'y może sobie zrobić być w aplikacji niezależnie (tzn. w ogóle nie stosując wątków). <br />Z praktycznego punktu widzenia to jest tak, że jeśli odpalisz aplikację gdzie zaimplementowałeś za dużo zależności od timer'a/timerów to zamulisz trochę system operacyjny (tzn. będzie zauważalny spadek wydajności w postaci reakcji we/wy typu kliknięcie na klawiaturze a reakcja na ekranie).<br />Przykład z życia: robisz aplikację, która wysyła dane przez port db-9 rs232 i jeśli to będzie dużo danych to na czas wysyłania/odbierania danych przyblokujesz sobie trochę system operacyjny jeśli funkcji wysyłającej/odbierającej dane nie zrobisz jako funkcji typu thread (wątek).<br /><br />Ja nauczyłem się stosować wielowątkowość z książki: &quot;C++ Builder 6 i bazy danych.&quot;, autor. Marian Wybrańczyk<br />Acha! <span style="text-decoration: underline">Tylko ta książka jest o C++</span>, a nie o C#.<br /><br />Pozdrawiam! j23 Jarek<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4504">j23</a> — 1 mar 2015, o 22:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-03-01T14:11:45+01:00</updated>
<published>2015-03-01T14:11:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10872&amp;p=121458#p121458</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10872&amp;p=121458#p121458"/>
<title type="html"><![CDATA[Re: Thread vs Timer]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10872&amp;p=121458#p121458"><![CDATA[
Ja bym do tego co powyżej dodał jeszcze takie coś. Otóż ciężko nawet porównywać timer vs thread, dlatego że to całkiem odmienne twory. Prędzej można byłoby porównać thread vs event w programie ... <br /><br />Timer albo powołanie jakiegoś zdarzenia (Eevent'a) ... przede wszystkim zawsze będzie się wykonywało w ramach głównego wątku aplikacji - no bo z tego sobie należy zdać sprawę - że aplikacja to już jest jeden główny thread (wątek) ... i teraz tak bardzo ogólnie mówiąc - dokąd wystarcza ci stosowanie timerów i eventów w twoich aplikacjach a przez to nie natrafiasz na żadne problemy które mogą wyniknąć w pewnych sytuacjach (np zamrażanie formy głównej ponieważ nagle jakiejś obsłudze timera albo zdarzenia powierzyłeś zbyt długotrwałą operację) .... no to spokojnie można korzystać z timerów i eventsów ....<br /><br />Ale gdy w pewnym momencie dojdziesz do takich aplikacji gdzie będzie trzeba w trakcie działania głównego programu, który coś musi robić (chociażby to miało oznaczać tylko interakcję z użytkownikiem na ekranie w głównym oknie) a jednocześnie musisz np obsługiwać ciężką i długotrwałą komunikację asynchroniczną RS232 albo obsługę jakiejś bazy danych (sporo obliczeń) .... i mogłoby to doprowadzić do zakłóceń w działaniu głównego wątku programu - to wtedy zaczyna być sensowne rozważenie po prostu użycia dodatkowych wątków, w których będziesz wykonywał długotrwałe operacje. Jednocześnie wtedy trzeba rzeczywiście dobrze przemyśleć komunikację i synchronizację pracy wszystkich wątków z wątkiem głównym - a szczególnie gdy ma to mieć bezpośredni wpływ na interfejs użytkownika.<br /><br />Przy okazji żeby wyjaśnić dlaczego moim zdaniem ciężko tu porównywać thread vs timer, to podpowiem tylko że w ramach wątku możesz sobie odpalić wiele timerów a nawet zdarzeń ... a odwrotnie jest to niemożliwe. Co najwyżej można powołać do życia jakiś wątek(-ki) w trakcie tyknięcia timera ...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 1 mar 2015, o 14:11</p><hr />
]]></content>
</entry>
</feed>