🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: alt.pl.comp.lang.csharp
Article #994

Re: Generowanie zdarzeñ

#994
From: Krzysztof Ciuba
Date: Fri, 23 Apr 2004 12:02
107 lines
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-mail
References: <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