hä? klar geht das dann "noch" (es geht nur so)
mutex m("lalala");
if (kann_mutex_locken(m))
lauf_normal();
else
schicke_parameter_an_andere_instanz_und_beende_dich();
natürlich kannst du auch das vorhanden-sein/nicht-vorhanden-sein des pipe-servers als indikation für "läuft schon" verwenden.
Hi,
nachdem du weißt das ein neues Gerät angeschlossen worden ist,
könntest du einfach das "neue" Verzeichnis überwachen.
Sobald das Gerät wieder getrennt wurde, ist auch das Verzeichnis
ungültig.
Wäre ein kleiner Workaround bist du eine andere "saubere" Lösung findest.
Gruß
Hi Community,
beim Versuch ein Form aus einem zweiten Thread zu erstellen, scheitert mein Code beim Invoke und wirft eine Exception.
Invoke oder BeginInvoke kann für ein Steuerelement erst aufgerufen werden, wenn das Fensterhandle erstellt wurde.
vom Typ InvalidOperationException.
Die Situation sieht wie folgt aus:
Ich lasse meine Anwendung auf Nachrichten einer weiteren Instanz meiner Anwendung warten. Die Nachrichten treffen über Pipes ein. Ist eine neue Nachricht eingetroffen, wird diese durch einen Parser gejagt. Dieser soll feststellen ob die Nachricht für meine Anwendung relevante Befehle enthält. Ist dies der Fall, so wird meine Anwendung angewiesen bestimmte von mir definierte Aktionen auszulösen. In meinem aktuellem Fall, soll ein neues WindowsForm erstellt werden um diverse Informationen anzuzeigen.
Um das Szenario ein wenig zu verdeutlichen, poste ich mal die relevanten Ausschnitte aus meiner Anwendung.
Mein delegate für die Funktion:
private delegate void InvokeFormPersonDetail(Stelle stelle, Person person);
Mein abonniertes Event:
void commanderEvents_OpenBewerber(Stelle stelle, Person person)
{
object[] parameters = { stelle, person };
Control ctrl = new Control();
ctrl.Invoke(new InvokeFormPersonDetail(CreateFormPersonDetail), parameters);
}
Die Exception tritt beim Invoke auf. Der Versuch im Konstruktor des aufzurufenden Forms ein CreateControl() zu platzieren um ein Win32 Handle zu erzwingen half leider nicht weiter.
Evtl. hat einer von euch eine Idee oder Lösung, die mich hier weiter bringen könnte.
Gruß!
Edit: Ich habe den Fehler gefunden. Mein Event muss natürlich so aussehen:
void commanderEvents_OpenBewerber(Stelle stelle, Person person)
{
object[] parameters = { stelle, person };
this.Invoke(new InvokeFormPersonDetail(CreateFormPersonDetail), parameters);
}
Der Invoke Aufruf muss natürlich auf meine Form (this) gelegt werden und nicht auf ein neues Control.
Jetzt funktioniert es wie es soll.
/Wenn der Admin möchte, kann er meinen Beitrag wieder entfernen./
http://msdn.microsoft.com/en-us/library/system.drawing.pen.dashpattern.aspx
MSDN schrieb:
An array of real numbers that specifies the lengths of alternating dashes and spaces in dashed lines.
Setz im Pen einfach
myPen.DashPattern = new float[]{2.0F, 20.0F};
dann müsste er 2 pixel linie, 20 pixel abstand usw im wechsel machen.
Hallo,
vielen Dank erstmal für Eure Antworten und sorry, dass ich mich erst jetzt melde (hatte doch noch kurzfristig Urlaub...).
Die Lösung sollte auf jeden Fall effizient sein, da ich das ganze mehrfach alle 5ms machen muss.
In meiner jetzigen Umsetzung habe ich testweise das große Array als Byte-Pointer-Array umgesetzt und die einzelnen Bytes der kleinen Byte-Arrays folgendermaßen verknüpft:
...
unsafe private void TestVerknuepfung()
{
this.bNichtInit = true;
for (int i = 0; i < this.test1.ByArray.Length; i++) {
fixed (byte* testByte = &this.test1.ByArray[i]) {
TestFrame.byDaten[i] = testByte;
}
}
for (int i = 8; i < 16; i++) {
fixed (byte* testByte = &this.test2.ByArray[i-8]) {
TestFrame.byDaten[i] = testByte;
}
}
}
...
//Objekt eines kleinen Byte-Arrays
namespace SchnellTest
{
unsafe public class Test
{
public Test(bool b)
{
if (b) {
for (int i = 0; i < this.ByArray.Length; i++) {
this.ByArray[i] = (byte)i;
}
}
else {
for (int i = 0; i < this.ByArray.Length; i++) {
this.ByArray[i] = (byte)(8 - i);
}
}
}
public Byte[] ByArray = new Byte[8];
}
}
//Objekt des großen Byte-Arrays:
namespace SchnellTest
{
unsafe public class Frame
{
public Frame() {}
public Byte*[] byDaten= new Byte*[16];
}
}
Der Test lieferte das gewünschte Ergebnis, ich bin mir aber noch unsicher, ob mir der GarbageCollector nicht Probleme bereitet und bspw. die "Adressen der kleinen Byte-Arrays" verwurstelt. Auch wegen der Performance bin ich mir nicht sicher. Habt Ihr dazu Informationen?
Den Vorschlag bezüglich Concat habe ich noch nicht weiter verfolgt, da ich momentan noch nicht ein Framework >= 3.5 benutze, werde ich dann aber bei Gelegenheit noch nachholen.
Dann merk dir doch pro Zelle mit Hilfe eines zusätzlichen Aufzählungstyps was für eine Grafik drin ist und lege es beispielsweise im DataGridViewCell.Tag ab.
da hast Du recht. Ich hatte ein Problem mit Xml-Datei gehabt.Die waren unterschiedlich.
Beim Selektieren hatte ich die Daten in einer DataTable und dann in meiner DataSet (ds1)exportiert, danach die xml-Datei generiert, und am Ende in ReportViwer exportiert. Ich hatte in der DataTable keine Spalten(Namen) definiert, hatte nur die Daten exportiert, das was.
Dank Dir.
Ups. Kleiner Umbenennungsfehler. Das Phänomen bleibt aber trotzdem bestehen. (Ist der StringBuilder bei dir wirklich null oder war das nur die Vermutung aufgrund der falschen Variable? Denn null wäre ja erst recht falsch, da man erwartet, dass der StringBuilder deserialisiert wird.)
Korrigierter Code:
using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
namespace ConsoleApplication3
{
[Serializable]
class Test : ISerializable
{
[Serializable]
private class InnerData
{
public StringBuilder Builder = new StringBuilder();
public string Str;
}
InnerData Data = new InnerData();
public Test() { }
void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
{
Data.Builder.Append("Test 1");
Data.Str = "Test 2";
info.AddValue("Data", Data);
}
private Test(SerializationInfo info, StreamingContext context)
{
Data = (InnerData)info.GetValue("Data", typeof(InnerData));
Output("ctor(SerializationInfo, context), nach info.GetValue");
}
public void Output(string where)
{
Console.WriteLine(where + ":");
Console.WriteLine("Builder: " + (Data.Builder == null ? "Ist null" : Data.Builder.ToString()));
Console.WriteLine("String: " + (Data.Str ?? "Ist null"));
Console.WriteLine();
}
}
class Program
{
static void Main(string[] args)
{
Test test = new Test();
using (Stream stream = File.Open("Test.txt", FileMode.Create))
{
new BinaryFormatter().Serialize(stream, test);
}
using (Stream stream = File.Open("Test.txt", FileMode.Open))
{
Test test2 = (Test)new BinaryFormatter().Deserialize(stream);
test2.Output("Main, nach Deserialize");
}
Console.ReadLine();
}
}
}
Das habe ich leider befürchtet. Ärgert mich ein wenig das ich mich nicht schon früher dmait beschäftigt habe auch bei kleineren Programmen und somit schonmal einen leichten Einstieg zu haben.
Mich wundert nur das Google keine Antwort liefert. Ich kann doch net der erste Mensch auf der Welt sein der sowas gemacht hat Bzw. machen will.
Ich danke dir erstmal, jetzt werd ich mir en Programm suchen und wie du mir geraten hast mich damit genau zu beschäftigen.
MfG snowfey
Prinzessin Sofia schrieb:
Warum dieser Quatsch mit short?
TextBox lastTextBox = null;
textBox1.LostFocus += new EventHandler(ForAlltextBoxes_LostFocus);
textBox2.LostFocus += new EventHandler(ForAlltextBoxes_LostFocus);
textBox3.LostFocus += new EventHandler(ForAlltextBoxes_LostFocus);
void ForAlltextBoxes_LostFocus(object sender, EventArgs e)
{
lastTextBox = sender as TextBox;
}
Wie lastTextBox initialisiert wird, ist anwendungsabhängig.
Das mit dem Short war ja nur ne Idee
Ach, so funktioniert das mit dem LostFocus. Ich probier das gleich mal.
Hallo, ich hab folgendes Problem.
Ich möchte ein XML Dokumen erstellen über das ich Werte einlesen möchte.
Das ganze geschieht so das ich ein XSD Dokument erstelle welches ich per XSD.exe zu einer Klasse mache die ich dann entsprechend Deserialisieren kann. Soweit so gut. Klappt auch eigentlich ganz gut. Nun hab ich aber folgendes Problem.
Ich möchte eine Menge von Elementen im XML beschreiben bei dem die Reihenfolge wichtig ist.
<Element1>
<SubElementType1> ..Daten für den Type.... </SubElementType1>
<SubElementType2> ..Daten für den Type.... </SubElementType2>
<SubElementType1> ..Daten für den Type.... </SubElementType1>
<SubElementType3> ..Daten für den Type.... </SubElementType3>
</Element1>
Im Programm möchte ich genau die Elemente genau in dieser Reihenfolge auswerten.
Definier ich SubElementType1 - 3 als Sequence werden die ja in der Reihenfolge angefordert und kommen als Array zurück. Das bringt dann also die Ordnung des XML Dokuments durcheinander und ist dann nicht mehr auswertbar.
witte schrieb:
GGG1 schrieb:
Aber das hier ist doch ein Auto-Property. Das heißt, hinter dem steht implizit eine Variable.
Der Name dieser Variablen ist aber nicht bekannt.
Genau das ist ja die Ironie: Wenn die Klasse serialisierbar ist, wird das Ding bei der Serialisierung automatisch mitgenommen. Es von der Serialisierung ausschließen ist dagegen nicht möglich.
Hi witte,
ja wenn ich den Designer dafür verwende funktioniert es.
Wollte es eigentlich gerne im Code implementiert haben um nachher eine Möglichkeit zu schaffen das ganze flexible zu gestalten, unabhängig von der Quelle oder von den Daten (Spalten).
Aber gut, werde es erst einmal dabei belassen.
Danke für deine Antwort.
Gruß
str n00b schrieb:
CSL schrieb:
1. Strings sind immer imutable
macht ja nichts, ich kann doch einer statischen string variable trotzdem verschiedene 'imutables' zuweisen.
Du willst eine referenz eines Strings in einer liste und dem string woanders was zu weisen und das in der Liste soll sich mit ändern, right? Das geht eben nicht da du bei der zuweisung einen neuen string erstellst, da imutable, dh dein string in der liste wird immer der alte bleiben, so lange bis du ihn explizit zuweist oder ihn in eine klasse schachtelst wie ich oben zeigte.
str n00b schrieb:
CSL schrieb:
2. Ein Key darf nur einmal existieren
weiß ich, der key soll sich ja nicht ändern, sondern nur der wert.
Du schriebst doch:
str n00b schrieb:
strings[a_string] = "another string";
zugewiesen. nun soll auch a_string 'automatisch' diesen wert bekommen.
Und das verstand ich so das der key auch ausgetauscht werden soll. Kann mich aber auch täuschen
str n00b schrieb:
CSL schrieb:
3. Doofe idee
nö, ganz im gegenteil. es geht darum weniger code bei der erneuten zuweisung schreiben zu müssen, weil ich von den a_string's ein paar dutzend vorliegen habe. mit c und c++ würd ich das mit zeigern hinbekommen, aber in c# weiß ich zurzeit noch nicht wie. vllt. iwie mit unsafe code, mal schauen
Verpacke doch deine "Dictionary" in ein eigenes Objekt umd erlaube lesen und schreiben nur über zwei Methoden (meinetwegen ein Property) und der sorgt dafür das alles korrekt abläuft, dann hast auch auch immer nur ein single point of entry.
Ich find die idee aber auch doof weil du so mal eben schnell böse Seiteneffekte bekommen kannst.
Die Sache ist ja ganz einfach die:
strings[a_string] = "another string";
du sagst da nicht "der string ist nun "another string", sondern du sagst "die gespeicherte referenz zeigt nun auf den "another string" im Speicher.
Der String worauf die Referenz vorher zeigte existiert noch weiterhin im Speicher, da deine interne liste darauf Zeigt.
-> C# ist eine eigene Sprache, man löst Sachen nicht so wie man es aus anderen Sprachen gewohnt ist also lass disen Unsafe Quatsch, wenn du es wie in C++ lösen willst kannst du auch in C++ bleiben.