[C#] NotifyIcon Balloon versturen via een andere thread

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben op dit moment bezig met een Hyves applicatie.

ik heb 1 thread voor het monitoren van nieuwe Tweets van de mensen die je volgt. Die thread update de GUI met nieuwe berichten. Nu wil ik het ook een notificatie ballon laten zien.

Dat heb ik geprobeerd op de volgede manier:
Icon1 is mijn NotifyIcon element

Ik gebruik deze functies.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        private delegate void UpdateLogCallback(string strMessage);
        public delegate void InvokeDelegate(string text);

        private void BallonTitle(string strMessage)
        {
            Icon1.BalloonTipTitle = strMessage;
        }

        private void BallonText(string strMessage)
        {
            Icon1.BalloonTipText = strMessage;
        }

        private void ShowBallon(string strMessage)
        {
            Icon1.ShowBalloonTip(int.Parse(strMessage));
        }


en dit staat in mijn thread:
C#:
1
2
3
4
5
6
7
8
9
10
11
                        object[] obj1 = new object[1];
                        obj1[0] = username + " Twitted:";
                        this.Invoke(new InvokeDelegate(this.BallonTitle), obj1); //Hier krijg ik Deze Error:
// Invoke of BeginInvoke kan niet op een besturingselement worden aangeroepen tot de vensterkoppeling is gemaakt.
                        

                        object[] obj2 = new object[1];
                        obj2[0] = updatetxt;
                        this.Invoke(new InvokeDelegate(this.BallonText), obj1);

                        this.Invoke(new UpdateLogCallback(this.ShowBallon), new object[] { "1000" });


Alleen ik weet niet hoe ik dit kan oplossen. ik heb ook al op google gezocht naar: Update NotifyIcon in a other Thread.
Maar Zonder resultaat..

Kan iemand mij uitleg geven over hoe ik dit kan oplossen?

Acties:
  • 0 Henk 'm!

  • Neverwinterx
  • Registratie: December 2005
  • Laatst online: 12-09 10:56
Zit hier geen oplossing tussen?

Acties:
  • 0 Henk 'm!

  • Down
  • Registratie: Februari 2005
  • Laatst online: 22:29
Is je icon op dat moment wel aangemaakt en niet null? Gewoon een kwestie van debuggen lijkt me. Daarnaast zou ik BeginInvoke gebruiken i.p.v. Invoke, omdat BeginInvoke je aanroep in de wachtrij plaatst en vervolgens verder gaat, daar waar Invoke wacht totdat je aanroep klaar is, hetgeen kan leiden tot een deadlock

Mother north, how can they sleep while their beds are burning?


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

titlefix: treath -> thread

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Waarom die invokeDelegate eigelijk?

Waarom gebruik je niet de built in class MethodInvoker? :)

En eigelijk zou je van je UI moeten afblijven (imo) in een andere thread. Gewoon een event schrijven, en attachen aan je thread en afvuren vanuit je thread.

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 16-09 15:42

Sebazzz

3dp

Snake schreef op zondag 23 augustus 2009 @ 09:25:
En eigelijk zou je van je UI moeten afblijven (imo) in een andere thread. Gewoon een event schrijven, en attachen aan je thread en afvuren vanuit je thread.
Zo zou ik het ook doen, maar je moet er dan wel op letten dat je de delegates op de juiste thread uitvoert. Hiervoor kan je DynamicInvoke en BeginInvoke gebruiken.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Sebazzz schreef op zondag 23 augustus 2009 @ 12:35:
[...]

Zo zou ik het ook doen, maar je moet er dan wel op letten dat je de delegates op de juiste thread uitvoert. Hiervoor kan je DynamicInvoke en BeginInvoke gebruiken.
Dat of de Dispatcher nabootsen van WPF. Een functie die een delegate accepteerd als parameter, die dan door de ontvangende functie ge-Invoked wordt :)

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Dred
  • Registratie: Juli 2004
  • Laatst online: 20-08 13:26
Sebazzz schreef op zondag 23 augustus 2009 @ 12:35:
[...]

Zo zou ik het ook doen, maar je moet er dan wel op letten dat je de delegates op de juiste thread uitvoert. Hiervoor kan je DynamicInvoke en BeginInvoke gebruiken.
Wat zij zeggen dus, met de manier waar jij op werkt is niet echt een good practice, UI hoor je niet zo te veranderen. Laat je weten of deze manier van werken je probleem opgelost heeft? Dit komt dan denk ik ook de reusability te goed mocht je later nog extra dingen willen doen met die ballonetjes

@Bovenbuur: lijkt me een ommeweg voor zoiets simpel

[ Voor 4% gewijzigd door Dred op 23-08-2009 16:19 ]


Acties:
  • 0 Henk 'm!

  • Dlanor74
  • Registratie: April 2009
  • Laatst online: 25-06-2024
Events gebruiken zou de makkelijke oplossing zijn.

mooiere oplossing zou een Queue zijn die geleegd wordt door een eigen thread

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
    class TestIcon
    {
        private Queue<BalloonInfo> m_BalloonInfoQueue = new Queue<BalloonInfo>(10);
        private NotifyIcon m_NotifyIcon;
        private Thread m_BalloonThread;
        
        public void AddBalloon(BalloonInfo value)
        {
            this.m_BalloonInfoQueue.Enqueue(value);
        }

        public TestIcon()
        {
            m_BalloonThread = new Thread(new ThreadStart(BalloonThreadMethod));
            m_BalloonThread.Start();
        }

        private void BalloonThreadMethod()
        {

            this.m_NotifyIcon = new NotifyIcon();
            // doe hier extra NotifyIcon init. gedoe 
            while (true)
            {
                if (m_BalloonInfoQueue.Count > 0)
                {
                    BalloonInfo bInfo = m_BalloonInfoQueue.Dequeue();
                    this.m_NotifyIcon.BalloonTipText = bInfo.BalloonText;
                    this.m_NotifyIcon.BalloonTipTitle = bInfo.BalloonText;

                    this.m_NotifyIcon.ShowBalloonTip(3000);

                }
            }

        }

    }

    struct BalloonInfo
    {
        private string m_BalloonText;
        private string m_BalloonTitle;

        public string BalloonText
        {
            get { return m_BalloonText; }
            set { m_BalloonText = value; }
        }

        public string BalloonTitle
        {
            get { return m_BalloonTitle; }
            set { m_BalloonTitle = value; }
        }
    }


Ik weet het, niet echt netjes gedaan maar ff snel als voorbeeld.

Hiermee omzeil je het UI thread gezeur en is de NotifyIcon in principe vanuit overal bereikbaar.
En het grote voordeel is dat je berichten gewoon netjes achter elkaar komen en niet dat 1 deel van je programma een balloon wegdrukt van een ander deel van je programma.

Het afsluiten van je thread mag je zelf uitvogelen ;)

Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 16-09 15:42

Sebazzz

3dp

Dred schreef op zondag 23 augustus 2009 @ 16:17:
[...]

Wat zij zeggen dus, met de manier waar jij op werkt is niet echt een good practice, UI hoor je niet zo te veranderen. Laat je weten of deze manier van werken je probleem opgelost heeft? Dit komt dan denk ik ook de reusability te goed mocht je later nog extra dingen willen doen met die ballonetjes
Waarom zou een event geen mooie oplossing zijn? En waarom mag je een event dan niet op de juiste thread uitvoeren dmv van DynamicInvoke en BeginInvoke?

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Badankt voor jullie reacties.

ik ga weer veder aan de slag...

Edit:

Ik heb het werkend... Als je nu inlogd met mijn applicatie krijg je eerst een lijst van alle tweets van je vrienden van het afgelopen uur. daarna krijg je nieuwe tweets als ballonen.

Veder blijft mijn applicatie maar icon's spammen. ( Windows 7 ). ookal staat hij uit...
ik post wel een nieuw topic als ik het niet opgelost krijg.

[ Voor 73% gewijzigd door Verwijderd op 24-08-2009 00:21 ]


Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Zowiezo zijn ballonnen een beetje deprecated aan het worden.

Prefered practice is het laten flashen van de button.

Kijk ook eens naar het Windows 7 API Code Pack. Misschien vind je daar wat leuks voor je applicatie netter te laten integreren met Windows 7 :)

Going for adventure, lots of sun and a convertible! | GMT-8

Pagina: 1