Laden...

Forenbeiträge von Larsen Ingesamt 192 Beiträge

11.09.2007 - 11:16 Uhr

Hallo,

das Problem scheint sich anders darzustellen.
Dazu muss ich erst noch mal erklären was ich da genau mache.

Also, ich habe ein UserForm(nicht der HauptThread) mit einem STOP Button mit dem ich den extraThread beenden können möchte. Der extraThread arbeitet eine bestimmte Zeit, die ich im UserForm über eine ProgressBar anzeige. Wenn ich nun das UserForm eher beende versucht offensichtlich der extraThread noch mal auf die ProgressBar zuzugreifen die dann nicht mehr existent ist (weil ich ja das UserForm beendet habe).
Da scheint sich das aufzuhängen. Im extraThread benutze ich InvokeRequired usw. so wie ich es in vielen Beiträgen hier im Forum nachgelesen habe. Und genau da steht der Debugger wenn ich auf Pause drücke. Der Thread bewegt sich kein stück mehr weiter.
Ich glaube ich muss irgendwie bevor ich auf die ProgressBar zugreife abfragen ob diese noch vorhanden ist (oder das UserForm).

Oder geht das irgendwie besser?

Gruß
Larsen

11.09.2007 - 10:33 Uhr

Hallo,
OK verstanden!
Du hast mit deiner Vermutung genau ins schwarze getroffen, der Effekt stellt sich genau dann ein wenn ich einen bestimmten Thread nutze.

Mein Handling sieht so aus, dass ich zuerst meinen "extra" Thread starte und anschließend ein UserForm öffne. Der extraThread soll solange laufen wie das UserForm aktiv ist. Nun setze ich nach dem UserForm eine globale Variable die ich im Thread in einer Schleife abfrage auf FALSE um den Thread zu beenden. Aber irgendetwas scheint daran nicht in ordnung zu sein.

Ist das ein schlechtes Design?

Gruß
Larsen

11.09.2007 - 09:29 Uhr

Hallo herbivore,

ich benutze Threads, den unterschied zwischen "extra Threads" und "normalen Threads" kenne ich nicht. Oder habe ich dich da mißverstanden?

Ich werde auf jeden Fall mal Prüfen ob mit der Beendigung meiner Threads was nicht in Ordnung ist.

Auf jeden Fall DANKE für die schnelle Antwort!

Gruß
Larsen

11.09.2007 - 09:15 Uhr

Hallo,
seit kurzem habe ich das Problem, dass mein Programm in der Entwicklungsumgebung nicht richtig beendet wird wenn ich auf das Beenden X rechts oben im Fenster klicke. Ich muß erst im Debugger noch mal auf STOP drücken, dann kann ich an den Sourcen weiterarbeiten. Das war früher nicht so, ich weiß aber nicht was ich geändert haben könnte das sich dieser Effekt einstellt.

Kennt jemand das Problem?

Gruß
Larsen

06.09.2007 - 16:10 Uhr

Danke,
das werd ich mal ausprobieren!

Gruß
Larsen

06.09.2007 - 16:03 Uhr

Danke,
werd ich ausprobieren!!!

Gruß

06.09.2007 - 08:54 Uhr

Hallo,
ich hab das jetzt mit der Eventsperre als Abfrage ganz oben im Event implementiert.
Das funktioniert auch ganz gut, aber das Control "pumpt" ziemlich beim Füllen.
Soll heißen der Scrollbalken vom DataGrid (Vertikal) nimmt beim Füllen unterschiedliche Größen an, bis das Füllen dann fertig ist.
Verstehen würde ich, wenn der Scrollbalken irgendwann erscheint und dann nur größer wird. Bei mir sieht das aber aus als würde er mal kleiner dann wieder länger.

Kann ich das auch noch irgendwie beheben?
Sieht nämlich wirklich komisch aus!

Gruß
Larsen

05.09.2007 - 21:44 Uhr

Danke für die Antworten,

ich werde es morgen mal ausprobieren.!!!

Gruß
Larsen

05.09.2007 - 19:18 Uhr

Hallo Experten,
ich habe ein Problem mit einem DataGridView!!!

Ich fülle das Grid aus diversen Daten.
Das funktioniert soweit auch alles prima. Wenn ich aber ein schon gefüllte Grid mit neuen Daten füllen möchte kommt es nach dem ...Rows.Clear(); zu Add und Click Events die ich nicht brauchen kann.
Zum Beispiel hat das anschließende Grid.Rows.Add(xyz) zusätzlich ein Click Event zur Folge!?

Kann man die Events für eine gewisse Zeit abschalten? Was mache ich falsch?

Vielleicht kennt jemand das Problem?

Gruß
Larsen

04.09.2007 - 22:01 Uhr

Hi, prima,
wie genau muß man das jetzt definieren,
kannst du die Funktion und das Interface mal posten?

Gruß
Larsen

27.06.2007 - 21:56 Uhr

Hallo,
hat jemand vielleicht ein Beispielprojekt?

Gruß

24.06.2007 - 12:34 Uhr

Hallo,
danke für den Link.
Wie ich ein Assembly für COM sichtbar machen kann habe ich im Griff.
Mir fehlt ein Stückchen Verständnis für das Design und da ich nicht aus der OOP Welt komme sondern meist nur C programmiere, auch für den Datenaufbau.

Das möchte ich machen:
Prog A stellt COM Schnittstelle zur Verfügung mit Klasse K
Prog B soll das ProgA über K fernsteuern.

Wenn ich nun in ProgB ein Objekt von K instanziiere, wie bekommt ProgA das mit?
Wie kann ich über die Methoden in K den Programmablauf in ProgA beeinflussen.

Ist bestimmt (wie fast immer) ganz einfach. Aber mir fehlt, wie gesagt, ein Stückchen Verständnis für diese OOP Welt.

Gruß
Larsen

24.06.2007 - 11:33 Uhr

Hallo Forum,

hat jemand ein gutes Tutorial oder ein Beispiel, wie man ein C# Prog mit einer COM Schnittstelle ausstattet.
Ich mochte das Programm über diese Schnittstelle fernsteuern und bestimmte Funktionen starten und stoppen können.

DLL´s für COM zu erstellen hab ich schon gemacht, andere Programme über COM zu steuern auch. Mir fehlt jetzt aber irgendwie der Einstie ein eigenes Programm mit so einer Schnittselle zu versehen.

Gruß
Larsen

30.05.2007 - 13:32 Uhr

hallo herbivore,

OK hab ich verstanden, ich dachte nur man kann doch nicht ein Projekt nur für so ein paar Strukturen anlegen. Kann man doch, hab ich jetzt gelernt.

Ich hatte die Strukturen auch nicht direkt in die Klasse gepackt sondern direkt unter den Namespace. Weil ich es nicht besser wußte habe ich dann noch ein leere Klasse reingepackt (wie gesagt ich dachte das müßte sein).

Also mach ich mal so weiter, die Klasse habe ich rausgeschmissen. Vom Design scheint das ja dann in Ordnung zu sein.

DANKE

Larsen

30.05.2007 - 10:15 Uhr

Hallo Herbivore,
die Antwort oben war für BerndFfm gedacht das hat sich etwas überschnitten.

Ich schreibe alle Daten die vorher in unterschiedlichen Dateien lagen in ein Dataset. Das Dataset wird vom Konverter erstellt und nur dieser kennt das Gesamtdatenformat (A,B,C). Deshalb dachte ich es wäre besser wenn der Konverter vorschreibt welche Daten er braucht um das DataSet zu füllen.

Und warum willst du dir Strukturen in einer Klasse einrichten [bzw. anlegen]? Oder meinst du Projekt und nicht Klasse?

Ich habe ein eigenes Projekt für die Strukturen angelegt mit einer Klasse, die eigentlich nur diese beinhaltet.
Und genau da bin ich unsicher ob das der richtige Weg ist.

Gruß
Larsen

30.05.2007 - 08:51 Uhr

Hallo,
ja ich meine damit eine Klassenbibliothek. Ich möchte die Art und Weise wie die Daten eingelesen werden nicht in den Konverter packen, da es unterschiedliche Fileformate mit den Daten gibt und ich nicht weiß wieviele ich noch im Konverter unterstützen muß. Das heißt kommt irgendwann noch ein File A3 daher, erstelle ich eine neue DLL die dann wieder die Struktur für den Konverter füllt.
Somit ist der Konverter relativ statisch und ich brauch da nicht ständig zu ändern. Bei der Erstellung der DLL für A3 braucht diese aber wieder Kenntnis über die Datenstrukturen, deshalb habe ich diese in eine eigene Klasse gesteckt.

Gruß
Larsen

30.05.2007 - 08:33 Uhr

Hallo herbivore,

ich habe in unterschiedlichen Files unterschiedliche Daten, nennen wir die mal Daten A,B,C.

Ich habe für jede Art von Daten zwei unterschiedliche File Formate. Also z.B. A1 und A2 haben den gleichen Inhalt aber in unterschiedlicher Speicherform. (Innerhalb einer Anwendung mit den Daten habe ich entweder A1 oder A2)

Mit dem Konverter bringe ich den Datenwust in ein XML Format mit A, B und C, damit wir endlich ein Standardformat haben.

Jetzt dachte ich mir, dass ich eine DLL für das lesen der Daten A1 erstelle und eine für das Lesen der Daten in A2 u.s.w.

Der Konverter soll über eine Struktur (das File mit A enthält dann ein Array dieser Struktur) festlegen, wie er die Daten haben möchte um sie weiter zu verarbeiten. Deswegen wollte ich das Array dieser Struktur im Konverter anlegen und der z.B. A1 DLL übergeben, damit diese gefüllt wird. Die DLL gibt das gefüllte Array wieder zurück.
Das gleiche dann mit den Daten B und C.

Ich habe für jeden Datensatzt (A,B,C) eine Struktur festgelegt die der Konverter und die DLL kennen muß um das dementsprechende Array zu übergeben.

Da aber beide, der Konverter und die DLL, diese Struktur kennen müssen, habe ich eine Klasse angelegt in der alle Strukturen für A,B,C angelegt sind.

Ich habe auch erst überlegt, ob ich die Struktur der DLL gebe und dann diese im Konverter nutze. Aber irgendwie finde ich das nicht so gut, da der Konverter die Struktur vorgibt und nicht die DLL. Ausserdem habe ich ja auch A1 und A2 und dann müßte die Struktur für A in den DLL´s für A1 und A2 konsistent gehalten werden.

Die Frage ist, macht man das so oder geht das ganz anders.

(Ich stelle immer wieder fest, dass es mir schwerer fällt meine Probleme zu formulieren als euch diese zu lösen 😉 )

Gruß
Larsen

29.05.2007 - 23:18 Uhr

Hallo,
ich habe eine Designfrage.

Ich möchte Daten in ein XLM Format konvertieren und hole mir mit einem Konverter-Programm (exe) Daten aus unterschiedlichen Files. Die Daten sollen aus unterschiedlichen DLL´s zusammengesammelt werden.

Jetzt habe ich mir das so vorgestellt, dass der Konverter eine Datenstruktur kennt und anlegt, die dann von einer DLL gefüllt wird.
Also die DLL hat eine Schnittstelle in der die Struktur als ref übergeben wird und füllt diese. Dadurch muß aber die DLL die gleiche struktur kennen um damit arbeiten zu können.

Mein Ansatz war nun der, dass ich eine Klasse einrichte, in der alle Strukturen als public eingetragen werden, die ich im Konverter und in einer DLL nutzen will. Auf die Klasse verweise ich in beiden Projekten (Konverter und DLL).

Sollte man das so machen? Oder geht das eigentlich anders viel besser?
Ich hoffe mein Problem ist halbwegs verständlich rübergekomen.

Gruß
Larsen

23.05.2007 - 09:26 Uhr

Hallo Rainbird,
danke für den Tipp. Ich glaube es jetzt gefunden zu haben.

Vorgehensweise:

  1. Virtuelle Maschine installiert, wie vorgeschlagen und der Fehler war trotzdem vorhanden.
  2. Setup Paket erstellt mit dem Update "Shared Add-in Support Update for the Microsoft .NET Framework 2.0 (KB908002)"

Über dieses Setup habe ich die DLL auf allen Rechnern, die vorher Zicken gemacht haben, ans laufen bekommen.

Das Update hatte ich vorher auch schon installiert, dachte aber das das ausreicht um dll´s zu erstellen die dann unter Office funktionieren. Auf die Idee ein Setup projekt mit dem Update zu erstellen bin ich irgendwie nicht gekommen, obwohl es in der Beschreibung zum Update so beschrieben steht. Da ich aber vorher noch nie so ein Projekt erstellt hatte wussten ich nicht richtig wie das gemeint war.

Eine Sache blieb aber noch nach dem Setup zu tun, ich musste die DLL danach doch noch mal mit Regasm registrieren obwohl ich das Setup mit Registrierung gebaut habe. Die DLL wurde erst richtig gefunden über:

Regasm.exe xyz.dll /tlb /CODEBASE

ohne CODEBASE ging es nicht. Kann man das noch irgendwie ins Setup einbauen?

Auf jeden Fall war der Tipp mit dem Setup meine Rettung!!!
Ich werd mich mal ein bisschen intensiver mit dieser Projektart auseinander setzen.

Zu Excel97, da hast du recht, das war früher auf dem Rechner, scheint aber nicht das Grundproblem gewesen zu sein. Nach der oben beschriebenen Vorgehensweise funktioniert die DLL auch unter Excel97 🙂) was frühere Probleme von mir gleich mit behebt.

Ich danke dir für den ausschlaggebenden Tipp. Ich dachte schon ich krieg das nie hin!

Gruß
Larsen

22.05.2007 - 09:47 Uhr

Hallo,
jetzt habe ich folgendes ausprobiert.

Ich habe auf einem anderen Rechner Office2000 und .Net2.0 installiert. Danach habe ich die dll ausprobiert. Ohne Erfolg. Dann habe ich die Version von Office2000 bis zum SP3 aktualisiert. Ohne Erfolg.

Ich bekomme meine dll´s auf anderen Rechnern einfach nicht ans laufen. Ein gravierender Unterschied ist das auf meinen Rechnern VS2005 installiert ist, da funktionieren die dll´s.

Den Verweis kann ich hinzufügen und im Objektkatalog Fenster ist die KLasse verfügbar mit allen Methoden.

Als Fehlermeldung kommt:
Laufzeitfehler '-2146232576(80131700)': Automatisierungsfehler

Weiß jemand einen Rat?
Bin für jeden Tip dankbar!!!

Gruß
Larsen

21.05.2007 - 17:38 Uhr

Hallo,
ich habe inzwischen einiges ausprobiert und eine TestDLL nach Vorlage von Rainbird erstellt.

Registrieren musste ich die DLL folgendermaßen, sonst hat es nicht richtig funktioniert:

Regasm.exe TestDLL.dll /tlb

Auf meinem Entwicklungsrechner funktionierte es direkt unter Excel2000 mit dem Zusatz /tlb bei der Registrierung , dann habe ich es auf meinem Laptop ausprobiert und hier mußte ich zur Registrierung /CODEBASE hinzufügen sonst gab es eine Fehlermeldung:

(Laufzeitfehler -2147024894: Automatisierungsfehler, Das System kann die angegebene Datei nicht finden).

Mit CODEBASE funktionierte die DLL dann auch auf meinem LapTop.

Guter Dinge habe ich dann die Registrierung bei meinem Kollegen in gleicher Art und Weise durchgeführt, ohne Erfolg. Die Klasse ist da, ich kann auch im Klassenfenster die Methoden sehen, aber wenn ich ein Objekt von dieser Klasse anlegen will, kommt bei der Zeile
Set A=new ...Class
eine Laufzeitfehlermeldung.

Hat jemand einen Rat, im Moment weiß ich nicht weiter.

Da ich das Interface als "[InterfaceType(ComInterfaceType.InterfaceIsDual)]" angelegt habe, ist doch frühe und späte Bindung möglich.
Bis jetzt habe ich immer einen Verweis eingefügt und dann versucht die Klasse aus der DLL zu instanziieren. Wie funktioniert das denn eigentlich mit der späten Bindung. Ich habe gelesen, dass man dann keinen Verweis braucht. Aber wie wird dann das Object angelegt?

Gruß
Larsen

18.05.2007 - 15:32 Uhr

Hallo Rainbird,
danke für deine Antwort.
Deine (nicht böse) Anmerkung ist natürlich berechtigt. Bei mir verhält es sich so, dass ich als C# Anfänger und selten Nutzer oft das Problem habe durch die MSDN-Library erschlagen zu werden. Beim Durchlesen stellen sich so viele neue Themen und Fragen, dass ich oft den Faden verliere.
Deshalb finde ich dieses Forum auch so gut, nicht um alles vorgekaut zu bekommen, sonder um mit der Nase in die richtige Richtung gestoßen zu werden. Dann versuche ich wieder alleine durch die Thematik zu kommen.
Ein weiterer Aspekt ist natürlcih, dass man wesentlich schneller zum Ziel kommt, wenn man die richtigen Stellen zu Nachlesen findet. Das das natürlich auch alles in der MSDN-Library steht ist klar, aber für mich ist das leider nicht immer verständlich weil mir oft Hintergrundwissen fehlt (bin halt nur Embedded C- SW Entwickler).

Ich hoffe das erklärt (zumindest teilweise) die Vorgehensweise von mir ans Ziel zu kommen.

Also DANKE nochmals für die Ausdauer aller die bereit sind ihr Wissen zu teilen.

Gruß
Larsen

PS: Ich werd´s jetzt in der MSDN-Library nachlesen...

17.05.2007 - 13:29 Uhr

Hallo Rainbird,
zwei Dinge sind mir nicht ganz klar:

  1. Warum wird über der Klasse "[ClassInterface(ClassInterfaceType.None)]" gesetzt und überdem Interface "[InterfaceType(ComInterfaceType.InterfaceIsDual)]". Vielleicht hast du einen Link wo ich das mal nachlesen kann, damit ich die Hintergründe verstehe.

  2. Wie genau muß das kommando zum regeistrieren sein, ich hab schon mal einiges ausprobiert, mit z.B. /Codebase oder ohne. Ich bin mir unsicher wie es nun genau registriert wird.

Gruß
Larsen

16.05.2007 - 08:39 Uhr

Hallo Rainbird,
danke für deine Tips, ich werd das alles mal in Ruhe ausprobieren und dann wieder posten.

Gruß
Larsen

15.05.2007 - 18:25 Uhr

Hallo Experten,

ich habe das Problem, dass ich meine dll (mit .NET erstellt und mit COM Interface versehen) nicht richtig unter Excel2000 ans laufen bekomme.

Versucht hatte ich es früher schon einmal unter Excel97 und habe durch dieses Forum erfahren, dass die Version einfach zu alt ist. Deshalb der Wechsel zu Excel2000.
Das Problem ist, das die dll bei mir auf dem Rechner gut funktioniert, nur bei meinem Kollegen eben nicht.

Ich weiß aber nicht wo der Unterschied zwischen den beiden Rechnern liegt (auf beiden ist Office 2000). Ich habe zwar eine etwas neuere Version, aber grundsätzlich sollte das doch mit der 2000ner Version funktionieren oder?

Kann ich eigentlich unter Office2000 auch auf dll´s zugreifen, die ich mit .Net erstellt habe ohne diese mühsam als COM dll zu erstellen?

Ich hab uach schon mal ausprobiert die dll in den GAC zu laden, ohne Verbesserung.

Hat jemand einen Tip für mich, eigentlich will ich doch nur Funktionen oder Funktionalitäten die ich unter .Net ganz einfach erstellen kann, auch unter Office nutzen, das kann doch eigentlich nicht so schwer sein oder?

Gruß
Larsen

17.04.2007 - 19:42 Uhr

Hallo,
danke für die Antworten!!!

die Variante StrResult.StartsWith("0x") kann ich nicht nutzen, da im falle von hex der string meist so aussieht:
"\x55 (0x55)"
Das heißt ich gucke erst mal nach ob ein 0x vorhanden ist (in dem Falle das es sich um Text handelt kann kein 0x drinn sein, da es sich bei Text um enum Werte handelt). Dann schneide ich den ganzen krams um das 0x55 weg und konvertiere dann mit Hex.
Ich hatte das extra aus meinem Codebeispiel weggelassen um nicht zu verwirren.

Das Beispiel mit IsNumericString(StrResult) finde ich ganz gut, gibt es da eine einfache Umsetzung?
Wie mache ich das am besten, muß ich jeden Wert innerhalb des Strings auf Bereich zwisch Asc(0x30-0x39) prüfen um zu sagen ob das ein NumericString ist? Oder geht das auch einfacher?

17.04.2007 - 10:06 Uhr

Hallo,
ich habe folgendes Problem:
ich lese aus einem Programm einen String aus. Dieser hat folgende Formate:
*12345 --> dezimal *0x1234 --> hexadezimal

  • HALLO --> Text

die ersten beiden will ich einfach nur in eine Zahl (long) konvertieren, der
Text soll Text bleiben.
Um zu erkennen was ich machen muß habe ich zur Zeit folgendes codiert:


try
            {
                //Test auf ENUM, falls das hier nicht klappt, lande ich im catch Zweig.
                if (StrResult.Contains("0x"))
                {
                    Ret = (Convert.ToInt32(StrResult, 16));
                }
                else
                {
                    Ret = (Convert.ToInt32(StrResult));
                }
                -----------------------------------------------------------------------------------
            }
            catch (Exception e)
            {
                //Wert ist Enum (Text)
                Ret = StrResult;
            }


(Ret ist object)

Das geht doch aber bestimmt viel besser oder?

Gruß
Larsen

26.03.2007 - 17:57 Uhr

OK,
das mit dem SingleCall probiere ich aus.
Aber ganz verstehe ich das noch nicht. In dem Beispiel das ich ausprobiert habe wird auf dem Server von der Remote Klasse keine Instanz angelegt über

 Class yxz =new Class() 

oder so etwas.
Es wird aber über den Aufruf den ich gepostet habe eine Instanz angelegt, auf die vom Client zugegriffen werden kann.


System.Runtime.Remoting.RemotingConfiguration.
RegisterWellKnownServiceType(
typeof(RemoteObject), "RemoteObject.rem",
System.Runtime.Remoting.WellKnownObjectMode.Singleton);

Wenn ich nun Daten vom Server anbieten will muß ich doch Daten in diese Klasse schieben (in die Instanz der Klasse). Also muß ich auch eine Instanz auf dem Server erstellen.
Oder ich mache Daten vom Server über die Klasse zugreifbar, aber wie?

Irgendwie fehlt mir hier ein Stück Verständnis.

Kann jemand die Lücke schließen?

Gruß
Larsen

26.03.2007 - 16:51 Uhr

OK,
ich hab jetzt einen Client und Server laufen.

2 Dinge sind mir aber noch nicht ganz klar.

  1. Wo ist der Unterschied zwischen Icp und Tcp?

  2. Ich verstehe noch nicht ganz wie ich die Klasse aufbauen soll, mit der ich den Datenaustausch realisiere.
    Wie schon gesagt System A schreibt Daten und System B liest (löscht) die Daten.
    Also muß SystemA ein Objekt von der Remote Klasse anlegen und SystemB genau dieses lesen.
    Mit diesem stückchen Code stelle ich die Klasse in den Server,


// Expose an object for remote calls.
System.Runtime.Remoting.RemotingConfiguration.
 RegisterWellKnownServiceType(
 typeof(RemoteObject), "RemoteObject.rem", 
 System.Runtime.Remoting.WellKnownObjectMode.Singleton);

Aber wie stelle ich sicher, dass beide System auf dem gleichen Objekt arbeiten?

Hat mal jemand ein stückchen Code zum abgucken?

Gruß
Larsen

26.03.2007 - 13:10 Uhr

OK,
DANKE , dann werd ich mal losgoogeln 🙂

Gruß
Larsen

26.03.2007 - 13:04 Uhr

Ja,
A und B laufen auf dem selben Rechner.

26.03.2007 - 12:57 Uhr

Hallo,
ich brauche mal einen Design Ansatz für folgendes Problem.

Ich habe eine System (A Testsystem) in dem kann ich nur eine C++ DLL implemtieren und
ein System (B executable) in dem möchte ich auf Daten aus dem System A reagieren.

Soll heißen, ich möchte in A eine C++ DLL einpflanzen, die mir Daten zur Verfügung stellt, die System B abgreifen kann.

Mal ganz naiv gesprochen A schreibt in eine Datei und B liest aus dieser Datei und löscht dann die bearbeiteten Daten. (Ist so natürlich Quatsch).

Der Datenaustausch sollte möglichst flott unterwegs sein.

Kann mir jemand sagen wie man das grundsätzlich macht?
Ich möchte das möglichst einfach umsetzen.

Gruß
Larsen

20.03.2007 - 17:38 Uhr

Hallo,
DANKE für die Antworten ich hab jetzt einen Weg gefunden, der funktional für mich OK ist.

In dem [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke) steckt wirklich alles was man braucht.
Es ist halt nur nicht so einfach das sofort zu verstehen.
Deshalb DANKE an alle die mir helfen wollten und geholfen haben.

Gruß
Larsen

19.03.2007 - 21:39 Uhr

Hallo nochmal,
ich hab mich mittlerweile durch viele Threads zum Thema durchgewühlt, bin aber bei einigen Dingen nicht sicher, ob ich sie richtig verstehe.

Es ist immer die Rede davon, dass ein Zugriff auf ein Control nur aus dem GUI Thread passieren sollte. Was genau ist damit gemeint.

Mein Aufbau ist schematisch folgender:


classe Form1{
   bool Ende;
   
   buttonClick{
      Form2 Frm2 =new Frm2();
      Frm2.Show();
      neuerThread.Start();
      Ende=false;
      while(neuerThread.IsAlive && Ende=false){
           Ende=MachWas(); // hier wird was gemacht was zyklisch abgefragt werden soll
           Thread.Sleep(100);
      }

   }

   neuerThread{
      while(Form2.visible==true){
        Frm2.FunktionPBar();
        Thread.Sleep(100);
      }
      Ende=true;
   }

}


classe Form2{

//ProgressBar u.s.w.

  FunktionPBar(){
    Zugriff mit Control.Invoke u.s.w.
    PBar.Value=ValueXYZ;
  }
}

Ist das eine gängige Lösung (ich hab´s noch nicht wirklich funktionsfähig bekommen), oder macht man das total anders?
Ist mit GUI Thread der Zugriff innerhalb der Form Class gemeint oder der Thread in dem das Objekt angelegt wurde?
Ich habe hier zwei Probleme.

  1. Kann das überhaupt funktionieren.
  2. Bei der Ausführung ist mein Frm2 immer eingefrohren und nicht bedienbar.

Irgendwie habe ich das Gefühl, dass ich in eine total verkehrte Richtung denke und das der Grund ist dass ich nicht weiterkomme.

Gruß
Larsen

19.03.2007 - 18:52 Uhr

meinst du damit, dass einzelne threads in den Hintergrund gesetzt werden können?

Da hab ich zwischendurch was drüber gelesen, sehe aber keinen direkten Zusammenhang zu meinem Problem. Aber ich sehe im Moment auch nicht wirklich irgend etwas 😦

Gruß
Larsen

19.03.2007 - 18:00 Uhr

Hallo,
ich komme einfach nicht weiter, mein Problem ist bestimmt schon tausend mal besprochen worden
und eigentlich ganz einfach.
Ich hab auch ein ganz schlechtes Gewissen diesen Thread nochmals zu strapazieren, aber ich
hab im Moment keine Idee mehr und nicht wirklich viel Zeit mein Problem zu lösen.
So sieht das Stückchen Code zur Zeit aus!


IN_WAIT_Value=IN_WAIT_Cnt  = Convert.ToInt16(Step.GetDelay());
Ret = false;
Frm_ManCmd = new ManualCommand(Step);
Frm_ManCmd.Show();
while (Ret == false && IN_WAIT_Cnt > 0 && Frm_ManCmd.Visible==true )
      {
      	 // Während dieser Abarbeitung soll Frm_ManCmd den Fortschritt anzeigen
      	 // und wenn der User es möchte, soll er das Fenster schließen können. 
         Thread.Sleep(100);
         int Value = GetSchnittstellenValue();
         Ret = CheckValue(Value);
         IN_WAIT_Cnt -= 100;
         // diese Funktion habe ich zum Aktualisieren der Bar ins Frm_ManCmd eingefügt
         Frm_ManCmd.SetPBarValue((int)(((float)IN_WAIT_Cnt / (float)IN_WAIT_Value) * 100));
         Frm_ManCmd.Update();
       }
Frm_ManCmd.Dispose();

in der While Schleife bleibe ich, solange der IN_WAIT_Cnt > 0, meine Schnittstelle den falschen
Wert liefert oder Frm_ManCmd.Visible==false ist. Das dauert ne weile!
In dieser Zeit möchte ich einfach nur den IN_WAIT_Cnt als Statusanzeige im Frm_ManCmd anzeigen.
Leider kann ich bei diesem Vorgehen das Frm_ManCmd nicht bedienen (vorzeitig beenden) da es, wie
ich vermute, aus dem Thread aufgerufen wird, der eigentlich zu 100% ausgelastet ist.

Also habe ich probiert das Frm_ManCmd aus einem anderen Thread, den ich zuvor starte aufzurufen.
Das klappt auch, nur bekomme ich jetzt den Vortschritt nicht vernünftig rübergeschaufelt.

Ich glaub ich seh den Wald vor lauter...

Ich hab auch wirklich schon recht viel ausprobiert und nachgelesen aber die Verwirrung wächst
eigentlich nur.

Nochmals ganz vereinfacht gesagt:
Ich möchte aus einer Schleife (läuft etwas länger) auf einem UserFrm den Fortschritt darstellen und
dabei das UserFrm noch bedienbar haben (vorzeitig abbrechen).
Kann jemand meine Verwirrung auflösen???

Die ganzen Beschreibungen und Threads die ich gelesen habe konnte ich nicht richtig auf mein Problem beziehen, alles sehr informativ aber es hat halt immer irgendwo gehakt.

Wäre wirklich sehr dankbar für einen Tip.

Gruß
Larsen

19.03.2007 - 14:34 Uhr

Oha,
ich hab in letzter Zeit viel über Threads gelesen und die Antwort eher da gesucht.
Also geschickt vorbei gegoogelt 😦

DANKE
Larsen

19.03.2007 - 13:19 Uhr

Hallo,
ich habe 2 Forms in unterschiedlichen Threads laufen.
Wie ich Daten von UserFrm1 nach UserFrm2 innerhalb eines Threads bekomme, hab ich schon rausbekommen.
Meine beiden sollen aber in unterschiedlichen Threads laufen.

Gibt es die Möglichkeit einen Speicherbereich zu definieren, auf dem beide arbeiten können?

Form1 schreibend
Form2 lesend

In Form 2 will ich nur den Fortschritt einer Berechnung unter Form1 darstellen.

Oder macht man das ganz anders?

Gruß
Larsen

17.03.2007 - 13:42 Uhr

Hallo,
ich habe mich schon mal ein bischen eingelesen und habe mittlerweile gelernt, dass meine momentane Lösung sehr schlecht ist.


...
Form MyForm = new Form();
bool bEnde = false;
int Cnt=3000;
MyForm.Show();

while ( bEnde ==false && Cnt >0 && MyForm.Visible == true){
  Thread.Sleep(100);
  bEnde =Schnittstelleabfrage();
  Cnt-=100;
}
MyForm.Dispose();

Das soll bewirken, dass meine Schnittstellenabfrage maximal drei Sekunden läuft oder durch das Beenden des Forms unterbrochen wird oder wenn Schnittstellenabfrage false zurück gibt.

leider mußte ich feststellen, dass ich keinen wirklichen Zugriff auf das Form habe. Liegt das daran, das ich das aus dem thread aufrufe, der meistens schläft?
Muß ich das UserForm aus einem sepearten thread aufrufen, den ich vorher starte?

Ich habe auch was über delegate gelesen, sollte man lieber damit arbeiten als direkt mit unterschiedlichen threads?

Über die Sleep(100) wollte ich eine Zeiteinstellung vornehmen, habe aber das Gefühl es laüft schneller. Kann das sein?
Also: bei Cnt=3000und Sleep(100) und Cnt-=100;
dachte ich kommt genau 3Sec heraus. Ich hab aber das Gefühl es ist schneller.

Ich denke ich brauche keine ganaue Anleitung, nur einen Wink in die richtige Richtung den Rest lese ich mir dann an.

Ich hoffe aus dem Codeschnipsel ist halbwegs klar was ich machen möchte.
Nochmal in Worten:
Ich habe eine Funktion die etwas länger auf ein Ereignis wartet, während ich warte will ich auf einem UserForm die restliche Wartezeit darstellen (Cnt). Das Warten soll aber auch abgebrochen werden, wenn ich das UserForm ausblende (visible=false).
Wie bekomme ich das hin, das ich mit dem UserForm arbeiten kann?

16.03.2007 - 09:17 Uhr

DANKE für den Codevorschlag.
Ganz verstehen tue ich ihn noch nicht aber das kriege ich schon hin 🙂

Ich hab schon mal ein bischen nachgelesen was man so machen kann, da öffnen sich für einen Anfänger Welten, an die habe ich bis jetzt nicht einmal gedacht!!!

Also, ich acker mich mal da rein.

Gruß
Larsen

12.03.2007 - 13:52 Uhr

Sry dafür, dass das etwas verwirrend klingt,
ich denke aber, du hast das schon richtig interpretiert.
Ich nutze den Timer aus System.Windows.Forms. Die Bearbeitung mit unterschiedlichen
Threads habe ich offensichtlich noch nicht so ganz verstanden.

Zuerst brauchte ich auch nur einen Timer, der mir etwas zyklisch aufruft. Dass jetzt der zweite hinzukommt ist wie immer eine Erweiterung der Programmfunktionalität, an die im Vorfeld nicht gedacht wurde.

Ich nehme also mit :
Mit den System.Windows.Forms Timer geht das nicht sinnvoll!

Kann mir jemand ein Beispiel nennen oder erklären wie das mit der Thread synchronisation funktioniert.

Gruß
Larsen

12.03.2007 - 10:39 Uhr

Hallo,
ich möchte folgendes machen:

Ich habe eine Funktion, die zyklisch von einem Timer aufgerufen wird. Innerhalb dieser Funktion ist der aufrufende Timer gestoppt. Nun möchte ich innerhalb dieser Funktion an einer Stelle eine zyklische Überprüfung (anderer Timer) einer Schnittstelle einbauen.

Jetzt habe ich festgestellt, wenn ich an der Stelle einen anderen Timer Starte komme ich nicht in die dementsprechende Tick Funktion wenn der Timer abgelaufen ist. Erst wenn die "Erste" Timerfunktion durchgelaufen ist komme ich dort hin.

Nun wäre es für mein Programm deutlich einfacher umzusetzen an dieser Stelle zu warten und zyklisch die Schnittstelle abzufragen ohne diese Funktion zu beenden.

So in der Art hatte ich das gedacht:


Timer1_Tick(){

   Timer2.Interval=500;

   Warte auf Timer2Tick
   Schnittsellenprüfung
   Wenn Prüfung noch nicht OK dann nochmals Timer2 aufziehen

}

Timer2Tick(){
 Aktiviere Prüfung
}

Ich hoffe das ist halbwegs verständlich!?
Hat jemand eine Idee wie man das machen kann?
Ich würde das Timerereignis auch pollen, weiß aber auch nicht ob und wie das geht.

Gruß
Larsen

26.02.2007 - 14:08 Uhr

das war ja mal wieder einfach.. 🙂)

Dafür liebe ich dieses Forum!!!!!

DANKE

Gruß
Larsen

26.02.2007 - 13:46 Uhr

Hallo,
ich habe folgendes Problem:

Ich möchte an einer Stelle im Code des UserForm A ein UserForm B aufrufen.
Im Code UserForm A möchte ich solange warten, bis UserForm B beendet ist.

Wie geht das?

Im Moment startet UserForm B und UserForm A läuft unbeindruckt weiter 😦

Kann mir jemand helfen?

Gruß
Larsen

21.02.2007 - 21:32 Uhr

eigentlich ja.
Der Fehler kommt auch nur beim ersten Füllen des Reports, wenn ich anschließend das DataSet ergänze kommt der Fehler nicht mehr 😦

Gruß
Larsen

21.02.2007 - 12:14 Uhr

Hallo Experten,
ich möchte einen Crystal Report mit einem DataSet füllen.

Klappt eigentlich auch, nur wenn der Report zum ersten mal mit dem Dataset verbunden wird, gibt es folgende Fehlermeldung


MyReport.SetDataSource(MyDataSet);

_
Fehler: Der index lag außerhalb des Bereichs. Er muß nicht negativ und kleiner als die Auflistung sein.
Parametername:index_

Kann mir jemad sagen was da falsch ist?

Gruss
Larsen

10.02.2007 - 07:55 Uhr

Das klingt nicht schlecht, was alles so geht!🙂
Ich glaube zwar nicht, dass das mein ursprüngliches Problem löst, ist aber dennoch sehr interessant für mich, da ich schon öfter was in VBA gemacht habe und immer vor dem Problem stand, wie das jetzt am besten auch bei anderen zu portieren ist.

Ich werde das mal ausprobieren.

Gruß
Larsen

09.02.2007 - 12:54 Uhr

Klingt gut aber was meinst du konkret?

Gruß
Larsen

07.02.2007 - 22:38 Uhr

da gehe ich von aus, dass es gute Konditionen geben wird.
Aber ich kann es leider nicht beeinflussen, habe aber für mich lokal zumindest ein Update auf Office 2000 beantragt, davon haben wir glaube ich auch ein paar lizenzen. Mal sehen ob meine Probleme damit erst mal behoben sind.

Gruß
Larsen

05.02.2007 - 12:23 Uhr

Hallo,
schade, das macht mir wenig Hoffnung 😦

Mit dem Umstieg auf Office2007 meinte ich, dass wir Umsteigen werden, wenn es nicht mehr anders geht. Wenn wir Dokumente vom Kunden bekommen, die wir sonst nicht mehr öffen können. Bis jetzt funktionierte das alles noch mit Office97. Aber auch mit dem Austausch von Dokumenten z.B. Office2000 und ´97 hatten wir schon Probleme.
Also warte ich noch ein bischen, bis sich das Problem von selbst löst.

PS: unsere Kunden arbeiten nicht mit ´97, wir haben noch den alten Sch...
mit dem Hintergrund, weltweit eine Einheitliche Version zu nutzen. Ein Update würde tausende Lizenzen betreffen.

Gruß
Larsen