Article View: alt.pl.comp.lang.csharp
Article #994Re: Generowanie zdarzeñ
From: Krzysztof Ciuba
Date: Fri, 23 Apr 2004 12:02
Date: Fri, 23 Apr 2004 12:02
107 lines
4576 bytes
4576 bytes
Tomasz Bosak wrote:
| Witam.
| Czy kto� pr�bowa� (czy jest mo�liwe) generowanie zdarze�
| "pseudosystemowych". Juz wyja�niam. Jedna klasa wy�wietla pasek
| post�pu i zmienia jego warto�� pod wp�ywem zdarzenia. Zdarzenie mo�e
| by� generowane w kilku innych klasach. Czy koniecznie musze
| zdefiniowa� z jakich klas b�d� odbiera� zdarzenie, czy tez istnieje
| sposob reagowania na zdarzenia pochodzace od "nieznajomych".
Witam,
Czytam grup� od pewnego czasu, pisz� tu po raz pierwszy. Ale do rzeczy.
W C# zdarzenia s� budowane na modelu Publisher <-> Subscriber. Ide� jest
zasada aby statycznej wi�zi mi�dzy klas� publikuj�c� zdarzenie, a
klas�-odbiorc�. Z tego wzgl�du implementacja interfejsu nie pasuje do tej
logiki, bo wymusza na klasie-odbiorcy implementacj� wszystkich metod
zdefiniowanych w owym interfejsie. A przecie� odbiorca mo�e nie by�
zainteresowany wszystkimi, mo�e te� w og�le nie by� zainteresowany
jakimikolwiek zdarzeniami generowanymi przez Publishera.
I tu zamiast interfejs�w idealnie pasuj� delegaci.
Publisher og�asza �wiatu swe zdarzenia i (w pewnym sensie) [nie dba]/[nie
musi dba�] o to, kto go s�ucha, cho� mo�e to zbada� je�li chce. Aktualn�
list� subskrybent�w konkretnego zdarzenia klasa Publisher mo�e otrzyma� za
pomoc� GetInvocationList() wykonanej na stosownym delegacie.
Musi by� jaki� mechanizm zale�no�ci pomi�dzy klasami, ale w trakcie
dzia�ania programu klasa mo�e si� swobodnie [dopisa� do]/[wypisa� z] listy
zdarza� innej klasy.
Ciekawy link:
http://www.sellsbrothers.com/writing/default.aspx?content=delegates.htm
BTW: ucz� si� C# od niedawna, wi�c co z�ego to nie ja ;O)
Poni�ej m�j ma�y przyk�adzik:
---
using System;
class ClassMain
{
static void Main()
{
Sender sender = new Sender("File compressor");
ProgressBar pbar = new ProgressBar();
sender.OnDelegProgress += new delegProgress(pbar.ReceiveProgress);
// klasa ProgressBar mo�e ale nie musi byc powiadomiona o ko�cu.
//sender.OnDelegCompleted += new delegCompleted(pbar.JobCompleted);
sender.StartProcessing();
Console.WriteLine("\n*** Main END ***");
System.Threading.Thread.Sleep(5000);
}
}
public delegate void delegProgress(object sender, int v);
public delegate void delegCompleted();
class Sender //Publisher
{
public Sender(string name)
{
this.name = name;
}
public string Name
{get{return this.name;}}
public void StartProcessing()
{
Console.WriteLine("Sender '{0}' : Starting processing...", this.name);
for(int i=0; i<11; i++)
{
System.Threading.Thread.Sleep(500);
if (OnDelegProgress != null)
this.OnDelegProgress(this, i);
}
Console.WriteLine("Sender '{0}' : Processing finished.", this.name);
if (OnDelegCompleted !=null)
this.OnDelegCompleted();
}
private string name;
public event delegProgress OnDelegProgress;
public event delegCompleted OnDelegCompleted;
}
class ProgressBar //Subscriber
{
public void ReceiveProgress(object theSender, int progress)
{
if (theSender is Sender)
{
this.name = ((Sender)theSender).Name;
Console.WriteLine("|In ProgressBar| Message from object '{0}' : my
progress is {1}", this.name, progress);
}
else
{
Console.WriteLine("<<ProgressBar>> Message from object {0} : my progress
is {1}", theSender, progress);
}
}
public void JobCompleted()
{
Console.WriteLine("<<ProgressBar>> Tak, widze ze to koniec.");
}
private string name;
}
---
---
pozdrawiam
KCiuba
Technical Details
Message-ID:
<c6b0l4$2gf$1@news.lublin.pl>Path:
mbox-mo1.pugleaf.net!archiver1.google.com!news1.google.com!news.glorb.com!nntp.idg.pl!newsfeed.gazeta.pl!news.nask.pl!lublin.pl!news.lublin.pl!not-for-mailReferences:
<c6847r$30aj$1@omega.artcom.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!archiver1.google.com!news1.google.com!news.glorb.com!nntp.idg.pl!newsfeed.gazeta.pl!news.nask.pl!lublin.pl!news.lublin.pl!not-for-mail From: "Krzysztof Ciuba" <kci...@calia.daewoo.lublin.pl> Newsgroups: alt.pl.comp.lang.csharp Subject: Re: Generowanie zdarzeñ Date: Fri, 23 Apr 2004 14:02:59 +0200 Organization: lubman Lines: 109 Message-ID: <c6b0l4$2gf$1@news.lublin.pl> References: <c6847r$30aj$1@omega.artcom.pl> NNTP-Posting-Host: cisus.daewoo.lublin.pl X-Trace: news.lublin.pl 1082721764 2575 195.205.71.17 (23 Apr 2004 12:02:44 GMT) X-Complaints-To: ab...@news.lublin.pl NNTP-Posting-Date: Fri, 23 Apr 2004 12:02:44 +0000 (UTC) X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2800.1106 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1106 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit