Avatar billede ashansen Nybegynder
12. juni 2007 - 13:23 Der er 24 kommentarer

invoke på teksboks

Hej gutter

Dette spørgsmål er blevet stillet mange gange, men jeg håber på at i vil og kan hjælpe mig alligevel.

Jeg har en metode, som kalder en anden med et argument.
Den metode som kaldes, skal bla. udskrive en parsed del af argumentet til en tekstboks.

Jeg er sikker på at jeg skal bruge invoke, jeg har prøvet mange ting, men jeg kan bare ikke få det til at virke.
Koden er følgende:

        private void EventHandling(string Message)
        {
            string[] _temp = Message.Split(':', ',');

            else if (_temp[0] == "SYNC" && _temp[1] == "PLAYLIST")
            {
                ShowActivePlaylist(Message);
            }
        }

        private void ShowActivePlaylist(string protocolData)
        {
            string HandledData = protocolData.Remove(0, 14);
            string[] ParsedData = HandledData.Split(':', ',');

            txtActivePlaylist.Text = ParsedData[0];

            lstAvtiveSequences.Items.Clear();

            lstAvtiveSequences.Items.AddRange(ParsedData);
        }
Avatar billede bennytordrup Nybegynder
12. juni 2007 - 13:26 #1
delegate void StringParamDelegate(string aString);

private void ShowActivePlaylist(string protocolData)
{
    if (InvokeRequired)
        this.Invoke(new StringParamDelegate(ShowActivePlaylist), null);
    else {
        string HandledData = protocolData.Remove(0, 14);
        string[] ParsedData = HandledData.Split(':', ',');
        txtActivePlaylist.Text = ParsedData[0];

        lstAvtiveSequences.Items.Clear();

        lstAvtiveSequences.Items.AddRange(ParsedData);
    }
}
Avatar billede bennytordrup Nybegynder
12. juni 2007 - 13:27 #2
Ovenstående kald af Invoke er efter hukommelsen - jeg har ikke lige kørende kode her.
Avatar billede ashansen Nybegynder
12. juni 2007 - 13:47 #3
Jeg får ingen compile error, men der bliver ikke udskrevet noget i txtActivePlaylist...

if(InvokeRequired) bliver aldrig kørt.. Det må vil betyde at tekstboksen ikke kræver indvoke.... Men giver det mening? Eller er det mon noget andet der er galt?
Avatar billede hmortensen Nybegynder
12. juni 2007 - 13:59 #4
Det burde ikke være nødvendig med invoke.
Bliver din ShowActivePlaylist metode overhovedet kaldt?
Avatar billede ashansen Nybegynder
12. juni 2007 - 14:01 #5
ja det gør det den, hvis jeg f.eks. indsætter en messagebox.show(data) udskriver den fint hertil...
Avatar billede hmortensen Nybegynder
12. juni 2007 - 14:02 #6
Og dit string array indeholder hvad det skal?
Du kan jo evt. prøve at udskrive det i din msgbox.
Avatar billede ashansen Nybegynder
12. juni 2007 - 14:06 #7
jep, det er det jeg har gjort med messagebox.show
Og deri kan jeg se at det jeg vil have ud er som det skal være...

Måske er det værd at nævne at EventHandling(string Message) får sin parameter fra en ekstern tråd, gennem delegate og event.
Jeg tror dog ikke det betyder noget, da det ikke er fra den eksterne tråd at jeg vil arbejde med tekstboksen
Avatar billede bennytordrup Nybegynder
12. juni 2007 - 14:09 #8
Er de hele Eventhandling(), du har postet?
Avatar billede ashansen Nybegynder
12. juni 2007 - 14:10 #9
nej hele eventhandling ser således ud

        private void EventHandling(string Message)
        {
            string[] _temp = Message.Split(':', ',');

            if (_temp[0] == "LIST" && _temp[1] == "PLAYLIST")
            {
                Form BD_User_LoadPlaylist = new BD_User_LoadPlaylist(Message);
                BD_User_LoadPlaylist.ShowDialog();
            }
            else if (_temp[0] == "SYNC" && _temp[1] == "PLAYLIST")
            {
                ShowActivePlaylist(Message);
            }
        }
Avatar billede ashansen Nybegynder
12. juni 2007 - 14:18 #10
EvntHandling() kaldes vha
BD_Server.MIDIEvent += new BD_Server.HandledMIDIEvent(EventHandling);

som griber på events fra en anden klasse i den eksterne tråd jeg har
Avatar billede ashansen Nybegynder
12. juni 2007 - 14:23 #11
hvis jeg laver ErrorHandling() således

        private void ShowActivePlaylist(string protocolData)
        {
            //if (invokerequired)
                this.Invoke(new StringParamDelegate(ShowActivePlaylist), null);
            //else
            //{
                string HandledData = protocolData.Remove(0, 14);
                string[] ParsedData = HandledData.Split(':', ',');
                txtActivePlaylist.Text = ParsedData[0];
                MessageBox.Show(ParsedData[0]);

                lstAvtiveSequences.Items.Clear();

                lstAvtiveSequences.Items.AddRange(ParsedData);
            //}
        }

Får jeg følgende fejl når der parsed på linien

this.Invoke(new StringParamDelegate(ShowActivePlaylist), null);


Invoke eller BeginInvoke kan ikke kaldes for et objekt, før der er oprettet en vindues-handle.
Avatar billede ashansen Nybegynder
12. juni 2007 - 14:27 #12
Her er alle exeption detaljer den giver

System.InvalidOperationException was unhandled
  Message="Invoke eller BeginInvoke kan ikke kaldes for et objekt, før der er oprettet en vindues-handle."
  Source="System.Windows.Forms"
  StackTrace:
      ved System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
      ved System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
      ved MIDIKlient.BD_User.ShowActivePlaylist(String protocolData) i D:\Dokumenter\Visual Studio 2005\Projects\MIDIKlient\MIDIKlient\BD_User.cs:linje 78
      ved MIDIKlient.BD_User.EventHandling(String Message) i D:\Dokumenter\Visual Studio 2005\Projects\MIDIKlient\MIDIKlient\BD_User.cs:linje 43
      ved MIDIKlient.BD_Server.DecodeProtocol(String ProtocolData) i D:\Dokumenter\Visual Studio 2005\Projects\MIDIKlient\MIDIKlient\BD_Server.cs:linje 145
      ved MIDIKlient.BD_Server.StartListener() i D:\Dokumenter\Visual Studio 2005\Projects\MIDIKlient\MIDIKlient\BD_Server.cs:linje 97
      ved System.Threading.ThreadHelper.ThreadStart_Context(Object state)
      ved System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
      ved System.Threading.ThreadHelper.ThreadStart()
Avatar billede bennytordrup Nybegynder
12. juni 2007 - 14:41 #13
Hvor er ShowActivePlaylist defineret? Er det på BD_User_LoadPlayList
Avatar billede ashansen Nybegynder
12. juni 2007 - 14:45 #14
begge de klasser jeg har postet er defineret i min form, dvs, i samme klasse som hedder BD_User.

De andre form/forme  jeg har fungerer som dialogbokse
Avatar billede bennytordrup Nybegynder
12. juni 2007 - 14:46 #15
Er formen synlig på skærmen?
Avatar billede ashansen Nybegynder
12. juni 2007 - 14:46 #16
hele min DB_User ser således ud

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Threading;
using System.IO;

namespace MIDIKlient
{
    public partial class BD_User : Form
    {
        delegate void StringParamDelegate(string aString);
       
       
        public BD_Server MIDIClient = new BD_Server();


        public BD_User()
        {
            InitializeComponent();
           
        }

        private void CloseConnectionToServer()
        {
            MIDIClient.CloseConnection();
        }

        private void EventHandling(string Message)
        {
            string[] _temp = Message.Split(':', ',');

            if (_temp[0] == "LIST" && _temp[1] == "PLAYLIST")
            {
                Form BD_User_LoadPlaylist = new BD_User_LoadPlaylist(Message);
                BD_User_LoadPlaylist.ShowDialog();
            }
            else if (_temp[0] == "SYNC" && _temp[1] == "PLAYLIST")
            {
                ShowActivePlaylist(Message);
            }
        }

        public void LoadPlaylist(int PlaylistToLoad)
        {
            CT_PlaylistSequence Load = new CT_PlaylistSequence();
            MIDIClient.SendMessage(Load.LoadPlaylist(PlaylistToLoad));
        }

        public void MakeConnectionToServer(IPAddress ServerIPAddress, int ServerPortNumber)
        {
            BD_Server.MIDIEvent += new BD_Server.HandledMIDIEvent(EventHandling);

            MIDIClient.SetupClient(ServerIPAddress, ServerPortNumber);

            Thread ClientThread = new Thread(new ThreadStart(MIDIClient.StartListener));
            ClientThread.Start();
        }

        //private void ShowActivePlaylist(string protocolData)
        //{
        //    string HandledData = protocolData.Remove(0, 14);
        //    string[] ParsedData = HandledData.Split(':', ',');

        //    txtActivePlaylist.Text = ParsedData[0];

        //    lstAvtiveSequences.Items.Clear();

        //    lstAvtiveSequences.Items.AddRange(ParsedData);
        //}

        private void ShowActivePlaylist(string protocolData)
        {
            if (invokerequired)
               
                this.Invoke(new StringParamDelegate(ShowActivePlaylist), null);
            else
            {
                string HandledData = protocolData.Remove(0, 14);
                string[] ParsedData = HandledData.Split(':', ',');
                txtActivePlaylist.Text = ParsedData[0];
                MessageBox.Show(ParsedData[0]);

                lstAvtiveSequences.Items.Clear();

                lstAvtiveSequences.Items.AddRange(ParsedData);
            }
        }

        public void UploadMIDIFile(string[] data)
        {
            MIDIClient.SendMessage(data[0]);
            MIDIClient.SendMessage(data[1]);
            MIDIClient.SendMessage(data[2]);
        }
       

        private void BD_User_Load(object sender, EventArgs e)
        {

        }
        public void ManageControls(string message)
        {


            //MessageBox.Show(message);


        }
        private void button1_Click(object sender, EventArgs e)
        {

            MIDIClient.SendMessage("SYNC");
            //CT_Status hehehe = new CT_Status();
            //hehehe.GetSyncronizationStatus("STATUS:UNSYNCRONIZED");
        }



        #region Menu buttons
        private void loadPlaylistToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            CT_PlaylistSequence LoadPL = new CT_PlaylistSequence();
            MIDIClient.SendMessage(LoadPL.LoadListOfPlaylists());
        }

        private void networkSettingsToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Form BD_User_NetworkSettings = new BD_User_NetworkSettings();
            BD_User_NetworkSettings.ShowDialog();
        }

        private void uploadMIDIFileToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            Form BD_User_UploadMIDIFile = new BD_User_UploadMIDIFlle();
            BD_User_UploadMIDIFile.ShowDialog();
        }

        private void closeToolStripMenuItem1_Click(object sender, EventArgs e)
        {
            try
            {
                CloseConnectionToServer();
                Environment.Exit(0);
                Application.Exit();
            }
            catch
            {
                MessageBox.Show("Error when closing MIDI Client");
            }
        }
        #endregion
    }
}
Avatar billede ashansen Nybegynder
12. juni 2007 - 14:47 #17
ja det er den, hvis jeg har if konstruktionen med, sker der bare ingenting. den fryser heller ikke eller noget
Avatar billede bennytordrup Nybegynder
12. juni 2007 - 14:52 #18
private void ShowActivePlaylist(string protocolData)
        {
            if (invokerequired)
               
                this.Invoke(new StringParamDelegate(ShowActivePlaylist), new object[] { protocolData });
            else
            {
                string HandledData = protocolData.Remove(0, 14);
                string[] ParsedData = HandledData.Split(':', ',');
                txtActivePlaylist.Text = ParsedData[0];
                MessageBox.Show(ParsedData[0]);

                lstAvtiveSequences.Items.Clear();

                lstAvtiveSequences.Items.AddRange(ParsedData);
            }
        }
Avatar billede ashansen Nybegynder
12. juni 2007 - 15:06 #19
det lykkedes heller ikke

den kommer ikke ind i if sætningen og afvikler
this.Invoke(new StringParamDelegate(ShowActivePlaylist), new object[] { protocolData });

men kun det der står i else....
Avatar billede ashansen Nybegynder
12. juni 2007 - 15:07 #20
og hvis jeg piller if sætningen væk, så melder den samme fejl igen
Avatar billede ashansen Nybegynder
12. juni 2007 - 19:03 #21
ok, nu har jeg fået det til at virke.... Men kun hvis jeg f.eks. fra en button metode kalder EventHandling() med den rette indrettede string, f.eks.

EventHandling("SYNC:PLAYLIST,navn1,0;seq0,1;seq1,ACTIVESEQUENCE;2");

Så det må være noget med at den ikke kan lide at få data fra min tråd, som ellers bliver overført via delegate og event.

Uddrag af min tråd
        //disse er erklæret for hele klassen
        public delegate void HandledMIDIEvent(string message);
        public static event HandledMIDIEvent MIDIEvent;
             
              //uddrag af den metode der genererer eventet og hiver data med
                case "SYNC":
                    if (ParsedData[1] == "PLAYLIST")
                    {
                        Synchronization += "SYNC:PLAYLIST," + ParsedData[2];
                        temp = "SYNC:PLAYLIST";
                    }
                    else if (ParsedData[1] == "SEQUENCE")
                    {
                        Synchronization += "," + ParsedData[2] + ";" + ParsedData[3];
                        temp = "SYNC:SEQUENCE";
                    }
                    else if (ParsedData[1] == "ACTIVESEQUENCE")
                    {
                        Synchronization += ",ACTIVESEQUENCE;" + ParsedData[2];
                        temp = "SYNC:ACTIVESEQUENCE";
                    }
                    else if (ParsedData[1] == "END")
                    {
                        HandledEventArgs ev = new HandledEventArgs();
                        MIDIEvent(Synchronization);
                        Synchronization = null;
                        temp = "SYNC:END";
                    }
                    break;


i min form startes denne tråd og en event trigger ting sættes op således

            BD_Server.MIDIEvent += new BD_Server.HandledMIDIEvent(EventHandling);

            MIDIClient.SetupClient(ServerIPAddress, ServerPortNumber);

            Thread ClientThread = new Thread(new ThreadStart(MIDIClient.StartListener));
            ClientThread.Start();

derefter resten således

        private void EventHandling(string Message)
        {
            string[] _temp = Message.Split(':', ',');

            if (_temp[0] == "LIST" && _temp[1] == "PLAYLIST")
            {
                Form BD_User_LoadPlaylist = new BD_User_LoadPlaylist(Message);
                BD_User_LoadPlaylist.ShowDialog();
            }
            else if (_temp[0] == "SYNC" && _temp[1] == "PLAYLIST")
            {
                ShowActivePlaylist(Message);
            }
        }


        private void ShowActivePlaylist(string protocolData)
        {
            string HandledData = protocolData.Remove(0, 14);
            string[] ParsedData = HandledData.Split(':', ',');

            if (textBox1.InvokeRequired)
            {
                DefaultDelegate d = new DefaultDelegate(ShowActivePlaylist);
                this.Invoke(d, new object[] { "hehe" });
            }
            else
            {
                textBox1.Text = ParsedData[0];
                MessageBox.Show(ParsedData[0]);
            }
        }


det undre mig at tekstboksen tilsyneladende ikke skal eller vil indvokes....
Avatar billede ashansen Nybegynder
13. juni 2007 - 15:12 #22
Har i slet ingen ideer?
Mon arne_v kigger forbi?
Avatar billede bennytordrup Nybegynder
13. juni 2007 - 15:17 #23
Hvad med this.InvokeRequired?

Skal MIDIEvent være statid?
Avatar billede ashansen Nybegynder
13. juni 2007 - 20:34 #24
this.invokerequired giver heller ikke noget

Ang. MIDIEvent, ja den skal være static, da jeg skal kunne gribe på den event der puttes i den, fra en anden klasse... f.eks. BD_User
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester