Hallo,
ich hoffe ihr könnt mir wieder ein bisschen behilflich sein, denn ich weiß absolut nicht weiter.
Folgendes:
Mein Programm kann nur ausgeführt werden, wenn ein anderes Programm ebenfalls gerade ausgeführt wird, denn über dieses wird unter anderem die Kommunikation über die serielle Schnittstelle realisiert. Dieses Programm hat jedoch ein Kollege programmiert, das heißt ich kann euch über dieses Programm nicht viel Auskünfte geben. Jetzt gibt es bei mir folgendes Szenario. Mein PC ist seriell mit einem anderen Gerät verbunden. Von meinem Programm aus kann ich den Befehl losschicken, dass sich das Gerät neustarten soll. Eh es aber wieder empfangsbereit ist dauert es eine bestimmte Zeit (die dummerweise, je nach Konfiguration des Gerätes, unterschiedlich lang sein kann). Jetzt habe ich mir gedacht, dass ich nach einem Neustart eine Anfrage an das Gerät sende, und wenn dabei eine Exception ausgelöst wird, dann weiß ich, dass das Gerät noch nicht empfangsbereit ist. Dann warte ich eine weile und sende die Abfrage erneut.
Jetzt treten aber bei mir folgende Fehler auf. Nach dem ersten erfolglosen Senden kommt eine Fehlermeldung des anderen Programms, dass die Daten nicht versendet werden konnten, was ja noch ok ist. Nach dem zweiten erfolglosen senden kommt diese Exception:
System.ServiceModel.ProtocolException: This channel can no longer be used to send messages as the output session was auto-closed due to a server-initiated shutdown. Either disable auto-close by setting the DispatchRuntime.AutomaticInputSessionShutdown to false, or consider modifying the shutdown protocol with the remote server.
Danach macht bei mir der ComPort dicht. Im Logging von dem anderen Programm kann ich aber noch sehen, dass das Gerät nach dem Neustart erfolgreich eine Nachricht an den PC schickt. Mein Programm schmeißt aber eine Exception nach der anderen.
Ich dachte eigentlich, dass das ein Problem mit der ser. Schnittstelle ist. Aber mein Kollege hat das verneint. Nun weiß ich nicht, wie ich es von meinem Programm aus wieder schaffe, etwas zu versenden. Mein Kollege wusste vorerst auch keine Lösung, kann sich aber momentan auch nicht drum kümmern, da er andere Aufgaben hat. Deswegen würde ich die Frage gern an euch weiterleiten. Ich hoffe, ihr habt nen Tipp für mich.
Ciao kati82
Hallo,
ich würde gerne mal wissen, inwiefern es ein guter Programmierstil mehrere try-catch-Blöcke in einander zu verschachteln, also dass in einem try-Block noch mal eine try-catch-Anweisung steht.
Ciao
kati82
Hallo,
ich möchte gerne, dass eine TabPage nicht "anklickbar" ist, wenn gerade ein bestimmter Vorgang läuft. Das heißt der Titel der Tabpage soll zwar sichtbar sein, aber wenn man drauf klickt, soll der Inhalt der Tabpage nicht sichtbar werden. Wie heißt die entsprechende Eigenschaft, die das bewirkt? Ich habe bei MSDN bzw. bei Google nicht das richtige gefunden. Oder geht sowas nicht?
Ciao kati82
P.S.: CanSelect wäre ja ne super Lösung, nur ist das ReadOnly 😭
Oh man, manchmal ist man echt bescheuert. Hat klick gemacht.
Danke für den Denkanstoß.
Hallo Forum,
ich stehe mal wieder vollkommen auf dem Schlauch und brauch deswegen mal wieder ein paar Weisheiten von euch. Mir tuts auch wirklich leid, euch mit dem nervigen Thema Threads schon wieder zu nerven.
Also bei mir ist folgende Situation. In einer Klasse habe ich alle Sachen, die das GUI betreffen, reingepackt. In einer anderen Klasse befinden sich ziemlich viele Funktionen, die diverse Berechnungen durchführen. Die Reihenfolge, wie diese Funktionen ablaufen sollen, bestimmt der Nutzer im GUI, ebenso die Parameter (meist von unterschiedlichem Typ), die die Funktion braucht. Dass ich die einzelnen Funktionen in (einzelne) Threads packen muss, ist mir schon klar, weil ja sonst mein GUI blockiert. Der Nutzer soll ja auch die Möglichkeit haben, die ganzen Berechnungen irgendwie abzubrechen.
Mein Problem ist jetzt ,dass eine Funktion immer erst gestartet werden darf, wenn die vorige fertig ist. Ich wollte es erst mit nem Monitor und einem Flag machen (nach dem Motto threadatwork==true --> Monitor.Wait), aber da weiß ich nicht ob das so effizient ist. Immerhin habe ich ja viele Threads. Da finde ich so viele Variablen nicht gerade sinnvoll.
Das beste Ergebnis hatte ich bisher mit dem ThreadPool und dem ManualResetEvent. Ich arbeite da mit Reset, Set und Waitone. Nur da weiß ich nicht wie ich den laufenden Thread im ThreadPool beenden kann. Habe dazu auch keine wirkliche Hilfe dazu im Internet gefunden. Zudem blockiert dann auch mein Thread, so dass der Nutzer die Prozesse gar nicht anhalten kann.
Ich könnte mir vorstellen, dass ein AutoResetEvent sinnvoller ist, aber wie mache ich da eine Parameterübergabe an den Thread im ThreadPool?
Ich hoffe, ihr könnt mir einen Tipp geben. Mir würde ja schon der Link zur passenden Seite reichen.
Ciao kati82
Hallo,
ich würde gerne bei Start meines Programms überprüfen welche Methoden (oder auch Threads) ich denn zur Verfügung habe und den Namen der Methode dann in einer Listbox anzeigen lassen. Also wenn es zum Beispiel eine Methode "adding" gibt, die zwei Zahlen addiert, soll diese dann in der Listbox angezeigt werden. Der Hintergund ist der, dass wenn ein anderer Programmierer noch mehr Methoden hinzufügt, das diese dann ohne viel Aufwand im Programm angezeigt werden und benutzt werden können.
Könnt ihr mir irgendein Stichwort nennen, wonach ich suchen muss. Mir fällt da irgendwie nichts ein.
Danke im voraus,
kati82
hallo herbivore,
sorry, leider habe ich dich jetzt nicht ganz verstanden.
mein problem ist es ja gerade nach außen hin mehrere möglichkeiten zu bieten, an bestimmte bereiche des speichers ran zu kommen. ich hatte irgendwie an so eine art gedacht wie:
if (start < ende)
{
for(counter=start; counter=ende; counter++)
{...}
}
else
{
for(counter=start; counter=ringspeichergröße; counter++)
{...}
for(counter=0; counter=ende; counter++)
{...}
}
start und ende (globale variablen) weise ich dann in der for-schleife einen wert zu. aber anscheinend ist das der falsche weg, weil dabei kommt nur unsinn raus. ich verstehe nur nicht ganz warum.
kati82
hallo leute,
meine diplomarbeit ist endlich durch und ich kann mich damit mal wieder mit anderen sachen beschäftigen. zur zeit versuche ich eine mikrocontroller in c zu programmieren und hätte dazu mal eine recht allgemeine frage zum thema ringspeicher.
und zwar folgendes: der mikrocontroller soll nachrichten decodieren. diese erhält er jedes bit einzeln. eine nachricht kann aber unterschiedlich lang sein. der ringspeicher, wo die nachricht bitweise reingespeichert wird, ist aber so dimensioniert, das die längste mögliche nachricht reinpasst. das reinschreiben und rauslesen funktioniert an und für sich. jedoch soll immer wenn ein bit ankommt ein decodier-algorithmus starten.
bis jetzt habe ich den quellcode in etwa so
struct
{
unsigned char readcounter;
unsigned char writecounter;
unsigned char buffer[ringspeichergröße];
}ringbuffer;
unsigned char putBit(boolean inBit)
{
ringBuffer.buffer[ringBuffer.writeCounter]=(unsigned char)inBit;
if(ringBuffer.writeCounter<(BUFFERSIZE-1))
{
ringBuffer.writeCounter++;
}
else
{
ringBuffer.writeCounter=0;
}
}
unsigned char getBit(unsigned char *position)
{
unsigned char returnValue=ringBuffer.buffer[ringBuffer.readCounter];
*position=ringBuffer.readCounter;
if(ringBuffer.readCounter<(BUFFERSIZE-1))
{
ringBuffer.readCounter++;
return returnValue;
}
else
{
ringBuffer.readCounter=0;
return returnValue;
}
}
unsigned char decode()
{
// counter soll den ganzen Ringspeicher langlaufen
for(counter=0; counter<ringspeichergröße; counter++)
{
bit = getBit(&bitposition);
// jetzt folgt eine ganz lange auswertung
}
}
und jedes mal wenn ein bit ankommt wird putBit() und decode() gestartet. mein problem ist aber, das ich nie so richtig weiß an welcher stelle ich anfangen soll mit lesen und wo ich damit aufhören soll. eine nachricht muss immer mit eine bestimmten anzahl von einsen beginnen. dort setze ich mein startzeichen. aber was ist, wenn die nachricht vom index des ringspeichers ziemlich weit hinten anfängt, so dass der zweite teil der nachricht wieder am anfang des ringspeichers steht. da komme ich mit meiner primitiven for-schleife nicht weit. irgend wie muss ich am anfang von decode() ein eine if-else-bedingung reinschieben. und in einer der anweisungen müssen dann halt eben zwei for-schleifen drin stehen (eine, die vom nachrichtenbeginn bis zum ende des ringspeicher läuft und eine, die vom anfang des ringspeichers bis (max.) zum nachrichtenbeginn läuft). doch diese if-else-bedingung zu formulieren fällt mir irgendwie schwer. zumindest kommt nie das raus, was ich will.
ich hoffe, iich konnte euch mein problem irgendwie verständlich machen und ihr könnt mir wieder ein paar tipps geben.
ciao kati82