Laden...
Avatar #avatar-3347.jpg
mogel myCSharp.de - Member
Wissenschaftler (wahnsinnig) Dabei seit 05.08.2010 156 Beiträge
Benutzerbeschreibung

Forenbeiträge von mogel Ingesamt 156 Beiträge

01.07.2015 - 14:14 Uhr

Wenn das CF aussterben soll, warum bring MS weiterhin laufend CE / Compact Versionen an den Markt?

Weil MS nur das Betriebssystem liefert, das Gerät aber von einem anderen Anbieter ist. Der hat das Gerät irgend wann für CE entwickelt und kann nicht den Entwicklungszyklus von ca. 2 Jahren einen komplette neue Version auf den Markt bringen. Mit W10 soll ja mal wieder alles anders und besser werden - glaube nicht daran. $BELIEBIGEFIRMA verdient nur wenn der alte Kram bewusst nicht mehr unterstützt wird.

Bei Windows Embedded Compact 7 kann ich VS2008 auch nicht mehr richtig verwenden. (Auf Gerät kompillieren oder Debuggen ist nicht mehr möglich)

Mit der Trial-Version kann ich wunderbar arbeiten. Gut, er kompiliert nicht auf dem Gerät (nur lokal) aber dafür kann ich super remote debuggen, was mit SharpDevelop nicht funktioniert (oder ich habe es noch nicht gefunden)

29.06.2015 - 14:45 Uhr

Die Express Edition gibt es noch hier zu finden:

>

weil damit kein CF möglich ist 😃 - ich habe ja 2010 Pro, damit geht es dummerweise auch nicht mehr - nur noch mit 2008


>

Warum nicht open Source benutzen?

Ich hatte mir zwar SharpDevelop angeschaut, aber anscheinend nicht richtig. Das erste Demo lief soweit gut. Werde da mal weiter drauf schauen.

28.06.2015 - 20:39 Uhr

Moin,

ich suche genau das was im Titel angegeben wurde. Problem ist das ich Software für Win 7 Compact, also .NET 3.5 Compact schreiben muss. Ab 2010 hat ja MS das ja rausgeschmissen. Für das kleine Projekt würde ich ungern noch 1000€ für eine neue Lizenz ausgeben wollen.

danke, mogel

26.07.2013 - 18:30 Uhr

Keine Ahnung, was Du meinst.

Wenn Du einen Broadcast absetzt nimmt .NET irgend eine Netzwerkschnittstelle. Wenn Du (wie im Normalfall) nur eine Netzwerkkarte drinnen hast, das passt das auch. Wenn Du aber mind. 2 Netzwerkkarten drinnen (DVB-Karte/VPN/...) wird der Boradcast zwar über alle Netzwerkschnittstelle geschickt - aber mit dem falschen Absender. Unter 1.1 hat er bei mir immer die IP von der DVB Karte genommen.

@OP1.Liste der Netzwerkkarten abrufen 1.auf jeder Netzwerkkarte einen Socket einrichten 1.Broadcast über jeden Socket absetzen

hand, mogel

btw: 255.255.255.255 funktioniert nur wenn es im Gateway frei geschaltet ist

07.07.2013 - 16:53 Uhr

Um dies zu "lösen" müsste also jede Nachricht sofort in die Datei geschrieben werden. Das ging bisher jedoch nur auf Kosten der Performance. 100.000 Einträge dauerten somit ca. 15 Sekunden.

Da Du keinen Quelltext postest, vermute ich mal:
1.log() - Aufruf 1.Log-Datei öffnen 1.Seek an das Ende 1.Meldung schreiben 1.Datei schließen

Das kostet richtig Ressourcen. Richtig wäre: Log-Datei am Programm Anfang öffnen, und nach jeder Meldung gleich flushen, Log-Datei nie schließen. Läuft bei mir nach diesem Prinzip seit Jahren.

Damit wirst Du auch keine Meldung verlieren.

Hand, mogel

26.06.2013 - 22:35 Uhr

Du könntest Dir ja mal die Outputs ausgeben lassen. Im Moment vermute ich das da jemand auf eine Eingabe von Dir wartet

13.06.2013 - 23:38 Uhr

Moin,

Ich schreibe momentan an einer PixelBotAPI.

für Tibia? zumindest hatte ich mal da den Gedanken....

Wie hast Du die Bewegung erkannt?1.bild(t-1) - bild(t) => diff1 && bild(t) - bild(t+1) => diff2 1.diff1 U diff2 => menge (bzw. geänderte Bereiche) 1.Segmentierung 1.Templatematching(t-1) & Templatematching(t) => Bewegung

  1. [...Auswertung...]

ich vermute Gaus & Co. hast Du weg gelassen, da die Bilder schon perfekt sind

Bei N logischen Kernen* können wirklich gleichzeitig auch nur N Threads ausgeführt werden.

bei X Threads die immer rechnen würde ich eher auf X ≤ N - 1 gehen, um dem BS und anderen Programmen auch etwas Platz zu gönnen

Ist es möglich mit einem Thread einen bestimmten CPU Kern anzusteuern?
[...]Dabei pfuschst du aber dem Scheduler vom Betriebssystem ins Handwerk und es ergibt sich oft ein eher nachteiliges Ergebnis.

bei der Aufgabe würde ich eher sagen macht es beim Prozessor Sinn. Das Ganze ist eine Mischung aus "wie arbeitet mein Programm" und "wie groß sind L1/L2/L3". Wenn der Cache nicht groß ist um 2 Bilder gleichzeitig vorzuhalten, dann ist es eher Sinnlos den Kern fest zunageln. Da sonst eh der Cache aus dem RAM jedesmal neu gefüllt wird, es also keine Geschwindigkeitsvorteile bringt.

Somit dürfte ein GetPixel - sofern Du das nutzt - nicht Thread-Safe sein.

so lange er nur liest ist das egal - aber - GetPixel ist schrecklich langsam (genau wie SetPixel). Das gesamte Bild muss in Rohdaten vorliegen um halbwegs in Zeit die Bilder verarbeiten zu können. Aber da er ja den Screenshot abgreift, hat OP ja schon ide Rohdaten (außer er hat in der Tat ein BMP draus gemacht).

hand, mogel

im Computer sind physische Kerne verbaut, diese können aber durch Techniken wie Hyperthreading als doppelt soviele logische Kerne verfügbar gemacht werden.

es lebe das Marketing 👅

11.06.2013 - 23:20 Uhr
port1.NewLine ="\x0D";

Wozu? Es kommen Bytes an. Wenn die Gegenstelle kein 0x0D sendet, dann kommt bei Dir auch "nichts" an.
*Setze SerialPort.ReceivedBytesThreshold auf 1 *setzte den entsprechenden Handler um das Event abzufangen *fülle im Event einen temporären Puffer mit dem Byte *wenn das entsprechende Paket voll ist, dann erzeuge ein eigenes Event und kopierst dabei die Werte aus dem temporären Puffer

Dann siehst Du zumindest schon mal ob überhaupt was zurück kommt. Wenn Du Dich auf des NewLine verlässt, siehst Du erst was wenn das NewLine gesendet wurde (wenn es überhaupt gesendet wird).

port1.WriteLine("\x13\x0D" + befehl + "\x0D\x11\x0D");

Wieso teilst Du dem Gerät mit das Du von ihm nichts empfangen willst, sendest dann was und sagst dem Gerät jetzt will ich was von Dir empfangen? Das ist eine eigenwillige Herangehensweise. Die beiden Steuerbefehle brauchst Du nur senden wenn Dein Puffer voll läuft. Ich glaube aber nicht das Du irgend wann auf der PC-Seite Probleme mit einem voll laufenden Puffer hast 😃 Das Problemkind ist eher die andere Seite - und der sagt Dir dann mittels Xon/Xoff ob er noch was von Dir empfangen will.

Ich weis jetzt nicht wie die SerialPort-Implementierung an der Stelle genau aussieht. Ob der SerialPort diese ankommenden Befehle entsprechend selber verarbeitet und Du Dich um nichts kümmern musst. Oder ob die Bytes durch gereicht werden. In letzterem Fall siehst Du bei der Verwendung von "NewLine" aber erstmal nichts. Bis der Xoff Befehl bei Dir angekommen ist, kann es sein das die Gegenseite zu gemacht hat, weil der Empfangspuffer voll ist.

Hänge parallel einen weiteren Rechner an die Datenleitungen und liest die reinen Daten aus. Also Baud & Co müssen passen, aber kein Handshake (weder Soft- noch Hardware!). Anzeigen lassen kannst Du Dir die Daten z.B. mit Term95. Allerdings musst Du aufpassen, Du kannst nur die Daten in einer Richtung sehen. Wenn Du die andere Richtung sehen willst, dann musst Du am parallelen Rechner Rx unt Tx tauschen (oder nimm einen weiteren Rechner/COM-Port ^^).

Ggf. beide GND mit einander verbinden.

hand, mogel

23.03.2013 - 21:54 Uhr

Was für eine Klasse BestThread ist, wissen wir nicht. Vermutlich enthält sie die Verarbeitungslogik. Es wird also wohl nicht ein Thread aus einem Thread heraus gestartet, sondern die Verarbeitungslogik aus einem Thread heraus. Das ist das gewünschte. Über den Klassennamen kann man natürlich streiten.

es hat etwas gedauert, aber Du könntest recht haben. Der Klassenname und der Methodenname lies mich in der Tat annehmen hier wird von Thread geerbt. Sollte das der Fall sein, werden 2 Threads gestartet. Ansonsten nur einer.

Bei mir würden die Alarmglocken schrillen, wenn jemand schreiben würde, dass er seine Threads nicht synchronisiert. Synchronisieren bedeutet ja in diesem Kontext nicht "hintereinander ausführen", sondern "thread-safe machen".

doch - "thread-safe" kann aber dummerweise auch zu einem "hintereinander ausführen" führen. ThreadA hat BM, ThreadB wartet. ThreadA gibt BM frei, ThreadB fängt an und lockt BM, ThreadA wartet sofort wieder auf BM. Genau deshalb die "Alarmglocken". Genau deshalb erstmal prüfen ob sich das Problem überhaupt parallelisieren lässt.

hand, mogel

22.03.2013 - 22:19 Uhr

Mo in,

Application.DoEvents ist eine Behelfskrücke für Leute die sich nicht mit Threads auseinander setzen wollen. Nutze doch bitte Thread::Join() wenn Du auf das Ende der Threads warten willst.

Du startest einen Thread um einen Thread zu starten. Wozu??

Dann Schreibst du irgendwo das Du deine Thread synchronisierst. Da schrillen doch die Alarmglocken. Wenn du die Threads untereinander synchronisierst ist jeder Thread sinnlos. Prüfe doch bitte ob sich Dein Problem überhaupt parallelisieren lässt. Um wenn ja wie. Wenn es sich nicht parallelisieren lässt, dann kannst du noch so viele Kerne und Threads Haben, es wird aber nicht schneller.

Hand, mogel

22.03.2013 - 21:53 Uhr

Mo in,

Der Keep-Alive Timeout ist afaik auf einen sinnlos hohen Wert gesetzt. Musst mal in den Tiefen der RFC suchen.

Wenn garantiert ist das du immer im Sekundentakt etwas bekommst, dann reicht es wenn du nach drei Sekunden nichts die Verbindung für gescheitert erklärst. Ich mach das im Moment mit meiner RS485 Verbindung genau so.

Alternativ selber Ping-Pong spielen und den Keep-Alive simulieren.

Hand, mogel

17.11.2012 - 06:12 Uhr

Moin,

Ein kleines Ferngesteuertes Auto mit einer CAM soll anhand des Video gesteuert werden können

Da Du an der Stelle eigentlich kein Zeitversatz gebrauchen kannst (Buffering), wird Dir nichts anderes übrig bleiben die Paket selber über UDP zu verschicken. Dabei musst Du dann jedoch damit leben das Paket (somit Teile des Bildes verloren gehen). Wenn Du die Größe der UDP-Pakete kleiner als MTU-Größe wählst ist das nicht tragisch.

hand, mogel

13.11.2012 - 12:28 Uhr

Moin, mein Senft dazu,

Das Problem ist, dass die Clientseite so schnell schickt, dass der Reveiver Thread, obwohl er nur die receiveMethode ausführt nicht hinter her kommt und dadurch packete verloeren gehen.

Ich weiß das es an der Performance dieses Threads liegt, da ich schon auf der Clientseite mit einem sleep(...), dass ganze etwas gedrosselt habe und siehe da, alles kommt an wie es ankommen sollte.

Wer sagt das der Server zu langsam ist? Evt. könnte es auch an Deinem lokalen Netzwerk liegen. UDP Pakete werden verworfen weil etwas bei der Übertragung nicht stimmt bzw. etwas schief gelaufen ist. Das kann bei einem ausgelastetem Netzwerk auch eine simple Kollision auf der Leitung sein. Wenn Du die sende-Frequenz drosselst, dann reduzierst Du automatisch die Kollisionen. Kann auch sein das Dein WLAN-Router selber nicht die Datenmenge verarbeiten kann. (1)

Gibt es vielleicht eine Möglichkeit den UDP-Thread auf ein Kern legen und die restlichen Threads auf den anderen. Habe aber dafür noch keine praktische Lösung gefunden.

Mit Thread-Prioritäten und Kernen rumzuspielen macht nur an zwei Stellen Sinn. Dein Problem gehört weder zum Thema Gameserver oder Bild/Daten-Verarbeitung.

Wie machen es die Könner 😃 bei ihren Video-oder Audiostreamings?

Lösungen wurden schon genannt
-> Leben das Pakete verloren gehen
-> RTP Streaming verwenden und Bilder Zeitversetzt sehen
-> TCP verwenden (ist aber vom Hauptproblem abhängig)

Da du nicht genau schreibst was Du am Client mit den Bildern genau machen willst, gibt es auch keine besseren Lösungsvorschläge.

hand, mogel

(1) nur weil ein Protokoll behauptet das man damit 300MBit/Sekunde übertragen kann, muss das noch lange nicht vom Gerät unterstützt werden. Aktuelles Beispiel: RS485 kann lt. Spezifikation 12MBit - mein Gerät schafft aber nur 115kBit. Mehr ist technisch nicht machbar. Ergo -> auch ein WLAN-Router schafft nicht immer alles.

25.10.2012 - 13:10 Uhr

Moin,

mir stellt sich die Frage wieso wurde die DLL so ausgelegt das man damit nicht vernüftig Kommunizieren kann

Ich will nicht, ich muss. Die DLL ist so ausgelegt, an der kann ich nichts drehen.

Du musst nicht, es geht nicht. Das Betriebssystem ist so ausgelegt, daran kannst Du nichts drehen ^^

Alles andere ist eine Verletzung der BS-Sicherheit. Das wurde zum Glück entfernt.

hand, mogel

21.08.2012 - 21:13 Uhr

Moin,

evt. wäre ein FileSystemWatcher der auf Änderung der Datei überwacht besser, als alle 100ms zu pollen ob sich die Datei geändert hat. Wenn es unbedingt Pollen sein muss dann ist ggf. 1000ms besser, da in der Zeit eh kaum ein Mensch was lesen kann.

hand, mogel

19.08.2012 - 15:18 Uhr

Moin,

über die suche mit dem stichwort "logfile" habe ich bis seite 9 gesucht, jedoch nix gefunden

ist ja auch klar - Du willst das Logfile ja auch auslesen und nicht nur "Logfilen"

oder?, mogel

PS: Treffer erste Seite

06.08.2012 - 23:32 Uhr

[...] näheres dazu
>

besser ist Control.BeginInvoke-Methode (Delegate) - Invoke synchonisiert mit dem GUI Thread. Das bremst unter Umständen den BK aus.

hand, mogel

14.07.2012 - 20:38 Uhr

Moin,

Hat sich nun selbst geklärt... War meine eigene Dummheit, der Code soweit war aber korrekt.

Wäre schön wenn Du andere Suchende (die das gleiche Problem haben) an Deinem Erfolg teilhaben lassen könntest. Aber ich vermute Du hast java.exe durch javaw.exe erstezt.

hand, mogel

08.06.2012 - 22:56 Uhr

Moin,

dass es recht komplexe Abhängigkeiten gibt (siehe [gelöst] VS10 - C# - Buildereignis vermisst: Reihenfolge des Compilierens mehrere Projekte), die VS nicht wissen kann ist mir klar. Wollte an der Stelle auch auf einen Spruch meines Profs hinaus: "Ab und zu muss man mal das Projekt aufräumen und alles nochmal erstellen".

Ansonsten kann man evt. eine Buildumgebung wie NAnt verwenden. Zur Not macht es auch eine Batch-Datei. Da kann man dann selber die Abhängigkeiten - auch von Dritten - explizit angeben.

hand, mogel

08.06.2012 - 21:11 Uhr

Moin,

Daher mußt du dann auch die SubChild-Assembly neu kompilieren.

eigentlich soltle das die IDE selber machen - aber nur eigentlich.

Ein kleiner Querveweis an Java, welche das Problem mal von einer ähnlichen Seite beleuchtet -> Eincompilierte Belegungen der Klassenvariablen

27.05.2012 - 22:02 Uhr

Moin,

versuch mal ein ContexMenü. Das Menü nimmt ToolStripItems entgegen. ToolStripItem erbt (direkt) von Component. Label, ProgressBar und PictureBox erben von Control, welches wiederum von Component erbt. Somit sollte das ContextMenü die entsprechenden Element selber enthalten können.

Quasi ein Control mit ein paar Label, ein Bild und einem ProgressBar (für die Kapazität). Und das Control dann dem ContextMenü hinzufügen.

hand, mogel

10.05.2012 - 11:04 Uhr

Moin,

2 Beiträge vorher -> Telnet: Datenpaket unvollständig?

hand, mogel

01.05.2012 - 21:34 Uhr

Moin,

AFAIR wird der Stream noch irgendwo gepuffert vor dem Senden.

	        this.__socket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true);

Was ich gefunden habe, waren sog. Telnet-Befehle: GA (Go Ahead), etc.
was aber seltsame Effekte ausgelöst hat, weil ich da noch nicht ganz durchsteige.

dann lieber wirkllich Telnet implementieren, nur weil Du über Telnet die Ereignisse siehst ist es noch kein Telnet 😉

glaube das wars, mogel

09.04.2012 - 15:01 Uhr

Moin,

Das heißt im Klartext: Ich möchte auf Knopfdruck einmal alle Geräte im WiFi-Netzwerk suchen,

Da gibt es keine gescheite Lösung, weil Du theoretisch für jeden herstelle entsprechend was programmieren müsstest. Das einzige was halbwegs zuverlässig funktioniert (abgesehen von Firewall) ist ein Ping. Also alle IP im Netzwerk testen..............

und über einen Socket einen Ping ins gesamte Netzwerk zu broadcasten, ähnlich, wie es mit dem Magic Packet geschieht, hat sich ebenfalls als nicht umsetzbar erwiesen.

ja - weil das in jedem Netzwerk deaktiviert ist (Smurf-Attacke)

hand, mogel

06.04.2012 - 10:56 Uhr

Moin,

ich erinnerte mich dunkel....

In den Eigenschaften der Projektmappe kannst du einstellen, welchen Projekt von welchen abhängig ist [...]

Das Stichwort war "Projektabhängigkeiten" und ist unter "Projekt" und NICHT unter "Erstellen" zu suchen. Das letzte mal als ich das nutze war VS2003.

danke, mogel

06.04.2012 - 10:02 Uhr

Moin,

Situation

Ich habe ein externes Projekt E. Dies stellt mir eine DLL mit verschiedenen Interfaces bereite (E-I) und eine DLL mit diversen Funktionen (E-F). Dann gibt es zu diesem Projekt Plugins (E-P1, E-P2, ... [E-Px]). Diese benötigen nur E-I.

Dann habe ich mein Hauptprojekt H, welches E-I und E-F benötigt. Die Plugins selber liegen in einem Unterverzeichnis von H. E-F reicht mir die Plugins E-Px die ich benötige durch und kümmert sich um die Instanzierung etc.

Problem

Das Problem ist das nach dem Build die Plugins E-Px in das entsprechende Unterverzeichnis von H kopiert werden müssen. Da aber nicht sichergestellt ist das E-Px vor H compiliert werden, kann ich in H das Post-Build-Event nicht verwenden. Sicher ist nur das E-I, dann E-F als Erstes (und Zweites) compiliert werden. Da H die Plugins E-Px auf Grund der Architektur gar nicht kennen darf, wird beim Build auch nichts kopiert.

Unter MonoDevelop kann ich im entsprechenden Pre-Run-Event ein Bash-Script starten das mir die DLL in das entsprechende Unterverzeichnis vor dem Programm start kopiert. Eben jenes Event fehlt mir für C# (oder ich finde es nicht). C++ hat noch einen "benutzerdefinierten Buildschritt", welcher eben genau das ist was ich für C# benötige.

hand, mogel

29.03.2012 - 08:45 Uhr

Moin,

Von einer 32Bit-Anwendung auf den 64Bit-Teil zuzugreifen ist in meinen Augen zwar nicht die feine englische Art, [...]

der Sinn, wieso MS in der Registry zwischen 32 Bit und 64 Bit trennt, erschließt sich mir nicht ganz. Ich habe die Registry bisher als Datenbank des System betratchtet wo alle relevanten Informationen drinnen sind. Und Informationen sind nicht an die "Bit-Breite" des OS gekoppelt - zumidnest in meinem wirren Kopf.


>

Damit hat es funktioniert

danke, mogel

28.03.2012 - 21:37 Uhr

Moin,

Ich vermute mal, dass das ein Problem mit 64bit-Systemen ist:
Ich denke, dass der Registrypfad
HKEY_LOCAL_MACHINE\SOFTWARE*Wow6432Node*\Microsoft\Windows NT\CurrentVersion
ist und nicht
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion

das vermute ich auch. Wenn ich da mit regedit rein schaue, dann fehlen da ein paar Werte - inkl. DigitalProductId.

Was du aber gegen diese Änderung tun kannst, weiß ich nicht?

Ich mache erstmal Ketchup auf die Tischplatte und beiße da rein.

Warum willst Du das direkt über die Registry machen?

Weil google bei "c# windows key" nur Registry-Tricks ausspuckte.

Je nachdem welche Werte Du genau willst kannst Du das ganze auch über WMI oder direkt über C# machen, sodass Du hier etwas unabhängiger bist.

Dann bin ich ganz Ohr - ich brauche einfach nur den Windows-Key der Installation.

hand, mogel

28.03.2012 - 16:51 Uhr

Moin,

ich versuche gerade meinen Windows-Key auszulesen. Mit Google wird man auch schnell fündig. Allerdings funktionierte das Snippet nicht bei mir. Weil genau der Value "DigitalProductId" nicht gefunden wird:


RegistryKey rKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion");
foreach (String name in rKey.GetValueNames()) Logging.info("-> RKN: " + name);
byte[] rpk = (byte[])rKey.GetValue("DigitalProductId4", new byte[] { 0xde, 0xad, 0xbe, 0xff });

Ausgabe:


INF - -> RKN: CurrentVersion
INF - -> RKN: CurrentBuild
INF - -> RKN: SoftwareType
INF - -> RKN: CurrentType
INF - -> RKN: InstallDate
INF - -> RKN: RegisteredOrganization
INF - -> RKN: RegisteredOwner
INF - -> RKN: SystemRoot
INF - -> RKN: InstallationType
INF - -> RKN: EditionID
INF - -> RKN: ProductName
INF - -> RKN: CurrentBuildNumber
INF - -> RKN: BuildLab
INF - -> RKN: BuildLabEx
INF - -> RKN: BuildGUID
INF - -> RKN: CSDBuildNumber
INF - -> RKN: PathName

rpk enthält am Ende eben das Steak statt den Windows-Key. Mit etwas Googeln lässt sich auch eine Lösung finden, statt "x86" muss das Ding bei mir auf "AnyCPU" oder "x64" stehen. Und schon lässt sich der Key auslesen. Das Problem ist aber das ich "x86" benötige, da ich auf eine DLL zugreifen muss die nur in 32 Bit vorliegt.

Nun interessiert mich wieso ich von "x86" nicht auf alle Werte in der Registry zugreifen kann?!

hand, mogel

BTW: auch mit Adminrechten und x86 ist dies nicht möglich. Zumal das auch nicht sinnvoll ist, da es ein Benutzerprogramm ist und Adminrechte nicht benötigt werden.

09.02.2012 - 10:43 Uhr

Es gibt ca 5000 Tiles die geladen werden. Auf der Platte sind das im Gesamten ca 2,5 MB. Und sie werden zwei mal geladen. Das kommt mir etwas viel vor.

sind die Tiles komprimiert oder als RAW-Datei auf der Festplatte? ... und wieso werden die Tiles 2 mal geladen - reicht einmal nicht aus?

Gibt es denn keine möglichkeit den Stream von dem Imgae abzutrennen? (Oder auf anderem Weg Bilder ohne Stream zu verarbeiten)

ja - in dem Du das Bild auf Bild zeichnest und das Bild zerstörst (entwirren darfst Du) ... dann kannst Du den Stream zerstören ... alternativ kannst Du die Bild daten auch in einen MemoryStream stecken und von da das Bild erzeugen

hand, mogel

09.02.2012 - 10:26 Uhr

Aber leider kann es kaum an diesen Punkten liegen. [...] Der Pfad zur Textdatei ist relativ (gleiches Verzeichnis).

wie herbivore schon schrieb - Deine Umgebung ist anders ... in dem Moment wo Du Dein Programm über geplante Task startest ist die Arbeitsverzeichniss "c:\windows\system32" (oder ähnlich) ... und da liegt Deine Datei nicht (sollte sie doch dort liegen machst Du was generell falsch)

Du hast 2 Möglichkeiten ... Variante 1 ist in geplanten Task das Arbeitsverzeichnis auf das Programverzecihnis zu legen ... Variante 2 - ist die gleiche - nur machst Du das programmtechnisch mit Application bzw. Environment ... am besten in der "ersten" Zeile (in main) ... musst mal die MSDN wälzen welche Properties Du da genau benötigst - mag gerade kein Windows anmachen

hand, mogel

05.02.2012 - 07:46 Uhr

Moin,

Equals vergleicht die Referenzen der Byte-Arrays ... und die sind nicht gleich

hand, mogel

01.02.2012 - 22:04 Uhr

lass das Programm über die Mittagspause oder Nachts laufen ... ist die einfachste Methode rauszubekommen ob Du ein Speicherleck hast ... wenn das Programm nicht wesentlich mehr Speicher frisst als zum Anfang ist alles gut ... und igrned welche Spitzen hängen mit der Arbeitsweise des GC zusammen ... der macht (mehr oder weniger) was er will bzw. wann er will

hand, mogel

01.02.2012 - 09:28 Uhr

Ich bekomm das irgendwie nicht disposed. Die Anwendung stürzt immer ab wenn ich das disposen will. Hier mein Anlauf:

ja klar ... weil


private void Resize(ref Bitmap Img, int Width, int Height)
{
    CroppedImage = new Bitmap(Width, Height);
    Graphics g = Graphics.FromImage(CroppedImage);
    g.SmoothingMode = SmoothingMode.HighQuality;
    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
    g.PixelOffsetMode = PixelOffsetMode.HighQuality;
    g.DrawImage(Img, 0, 0, Width, Height);
    g.Dispose();
    Img = CroppedImage;
    CroppedImage.Dispose(); //Crash
}

Du übergibst Img ... zeichnest das auf CroppedImage ... weist die Referenz von CroppedImage an Img ... dann zerstörst Du CroppedImgage ... damit auch Img - zeigen ja beide auf die gleiche Referenz ... Du musst Img zerstören bevor Du Img die neue Referenz zuweist ... und die alte Methode war besser



private Bitmap Resize(Image Img, int Width, int Height)
{
    Bitmap CropedImage = new Bitmap(Width, Height);
    Graphics g = Graphics.FromImage(CropedImage);
    g.SmoothingMode = SmoothingMode.HighQuality;
    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
    g.PixelOffsetMode = PixelOffsetMode.HighQuality;
    g.DrawImage(Img, 0, 0, Width, Height);
    g.Dispose();
    Img.Dispose(); // <--
    return CropedImage;
}
31.01.2012 - 19:12 Uhr

Moin,

private Bitmap Resize(Image Img, int Width, int Height)

hier erzeugst Du eine weitere Bitmap, die nicht zerstört wird (kein Dispose-Aufruf)

Always call Dispose before you release your last reference to the Image. Otherwise, the resources it is using will not be freed until the garbage collector calls the Image object's Finalize method. Image.Dispose Method

13.01.2012 - 07:34 Uhr

Die Chance jemanden hier zu erwischen, der sich genau damit gut auskennt, ist aufgrund solch einer Verbreitung relativ gering

na ja ... Auerswald selber ist recht gut - sollte also nciht relativ gering verbereitet sein ... allerdings ist die Webseite sehr ausführlich - dort gibt es auch irgendwo eine Telefonnummer für Support die sehr freundlich sind

hand, mogel

16.12.2011 - 21:50 Uhr

Ich möchte gerne die Subnetzmaske "255.255.0.0" angeben. Wo mache ich das?

in dem Du die entsprechende Broadcast-Addresse berechnest ... Subnetzmaske invertieren und das dann mit einem Bitweisen-Oder einer IP aus dem Subnetz verknüpfen

13.12.2011 - 13:15 Uhr

Moin,

ich habe einen Rechner ... der steht mitten in Berlin und baut über UMTS eine Verbindung zu einem Server auf ... funktioniert auch ganz gut - bis der Stick irgendwie eine "Macke" bekommt ... in dem Moment bricht die Verbindung ins Internet ab

selbst ein Neustart des Rechners hat keinen Erfolg, da der Stick nicht neu gestartet wird und somit noch immer in seiner internen Endlosschleife hängt ... ein Herunterfahren des Rechners bringt auch nichts, da der Stick noch immer mit Energie versorgt wird ... erst wenn ich den Rechner vom Netz ziehe (also Stecker vom Netzteil raus) geht auch der Stick aus ... nach einem Neustart des Rechners funktioniert der Stick wieder ... gleiches kann ich natürlich erreichen indem ich den Stick einfach abziehe und wieder ran stecken

allerdings kann ich das keinem Kunden zumuten ... daher war der Gedanke das Gerät zu entfernen bzw. im Gerätemanager zu entfernen ... Tests von Hand brachten leider auch nichts als Enttäuschungen

hat jemand eine Idee wie ich auf das Gerät zugreifen kann um es zurück zu setzen

danke, mogel

17.11.2011 - 08:42 Uhr

Trotzdem würde mich interessieren ob es noch andere Dinge tun kann.
Immerhin gibt es ziemelich viele Öffentliche Webservices im Internet.
Irgednwie müssen die ihre Services doch auch absichern?

das ganze kannst Du einfach runterbrechen auf ganz einfache Details ... Du hast einen Port und dahinter läuft ein Programm ... ob das IIS oder Apache oder was eigenes ist, ist völlig egal ... in dem Moment wo Du einen Dienst im Internet anbietest musst Du damit rechnen das jemand Dummheiten damit versucht

das einzige was Du machen kannst ist regelmäßig Updates einspielen und bei der Programmierung diverse Sicherheitsbestimmungen beachten (bereits angesprochene Benutzerrechte) ... das einzige was Du nicht beeinflussen kannst, ist ein Angriff mit einem Zero-Day-Exploit

14.11.2011 - 12:49 Uhr

*nimm ein Label und Positioniere es *in Abhängigkeit von X ändere die BackgroundColor-Eigenschaft des Labels

21.10.2011 - 08:43 Uhr

Wenn das Dictionary z.B. vom Typ Dictionary<string, ARule<T>> wäre, würde das Add gehen.

dann habe ich den Cast wenn ich die Regel wieder aus der Dictionary hole ... außerdam habe ich mehrere Dictionarys mit unterschiedlichen Regeln ... eigentlich wollte ich das füllen der Dictionarys im Konstruktor der jeweiligen Regel vornehmen ... was ich aber inzwischen ausgelagert habe in eine eigene Methode

Wie das geht, weißt du wenn du Generics richtig verstanden hast 😉.

lässt Du mich bitte nicht unwissend sterben ... mit Constrains komme ich auch nicht weiter

hand, mogel

21.10.2011 - 08:31 Uhr

Moin,

nicht nachvollziehbar

Fehlermeldung:
Source:System
Message:Operation on non-blocking socket would block

MonoDevelop 2.4 & Mono 2.6.7 ... außerdem ... enn es keinen besonderen Grund gibt das HTTP-Protokoll von Hand nach zu basteln, nimm den WebClient

noch was

            }catch{
                errorreceive=true;
            };
            try{
            while (bytes > 0) {
                bytes = socket.Receive (Empfangsbyte, Empfangsbyte.Length, 0);
                ergebnis = ergebnis + ASCII.GetString (Empfangsbyte, 0, bytes);
            }
            }catch{};try{
            socket.Close ();}catch{};

ich sehe 3 catch die Dir keine einzige Exception ausgeben ... das macht sich für Fehlersuche nicht wirklich super

hand, mogel

18.10.2011 - 08:09 Uhr

IP ändert sich bei mir täglich (keine Ahnung warum .) aber den Router zu prüfen ist eine gute Idee thx 🙂

😉 ... Grundlagen - dafür mal ein paar Stichworte für Dich ... NAT, dynamische IP, Portweiterleitung und dyndns.org (oder ähnlich, Dein Router wird Dir ggf. einiges anbieten)

hand, mogel

17.10.2011 - 20:10 Uhr

Moin,

Wenn ich das richtig sehe, dann ist dein Fehler, dass du in der Verbung nicht fit bist.
Im ersten Code möchtest du ARule<T> in das Interface T konvertieren, dafür muss aber ARule<T> T implementieren. T wird aber nur von der Abgeleiteten Klasse implementiert.

also war mein Gedankengang doch richtig

der Compiler weis nicht was da zur Laufzeit für Typen ankommen ... zur Laufzeit würde es funktionieren
Das hast du noch nicht verstanden.

der Compiler hat einfach keine Ahnung das später noch entsprechende Klasse auftauchen die T implementieren werden ... das brachte mich aber auf die Lösung ... mit dem Umweg über Object funktioniert es nämlich


public class AGeneric<T> {
	
	public AGeneric (Dictionary<string, T> dic, string key) {
		// dic.Add(key, (T) this); -- geht nicht
		dic.Add(key, (T) ((object) this)); // geht
	}
	
}

Doch wenn T nicht der Typparameter sondern ein Interface ist.

ja - ist ein Interface (vgl. 1.Posting)

hand, mogel

17.10.2011 - 19:06 Uhr

Das hast du noch nicht verstanden. Es ist ja gerade der Vorteil von den Generics, dass zur Compile-Time, also beim Kompilieren, die Typprüfung stattfinden kann.

eigentlich bin ich der Meinung das ich Generecis prinzipell verstanden habe (daher verwende ich es ja) ... aber irgendwo ist da wohl in meinem Kopf der Wurm drinnen ... dann versuche ich es mal anders zu erklären und evt. lässt sich dann mein Denkfehler finden

ich habe eine Basisklasse ... die bekommt im Konstruktor ein Dictionary was das Interface T entgegen nimmt


public class ARule<T> {

        protected ARule(Dictionary<string, T> rules, XmlNode basis) {

dann habe ich eine Klasse ... dann habe ich Kinderklassen die von der Basisklasse und T erben und einen Referenz auf das passende Dictionary übergeben

    public class TKlasse : ARule<T>, T {
        public TKlasse(Dictionary<string, T> rules, XmlNode basis)
            : base(rules, basis) { }
    }

also sollte doch TKlasse dem Dictionary hinzugefügt werden können - da sich die Klasse ja nach T casten lässt


rules.Add(key, (T) this);

aber das geht nicht

btw: der Quellcode war dann die aktuelle Lösung

02.10.2011 - 00:11 Uhr

Moin,

wenn ich es richtig verstanden habe ... der Compiler weis nicht was da zur Laufzeit für Typen ankommen ... zur Laufzeit würde es funktionieren - aber - der Compiler weis es nicht und daher gibt es die Fehler

	public class Rules {
		
		private static Dictionary<string, IRuleSkill> skills = new Dictionary<string, IRuleSkill>();
		private static Dictionary<string, IRuleItem> items = new Dictionary<string, IRuleItem>();
			
		public static void ParseRules(string rulefile) {
			Logging.info("parse Spieleregeln");
			XmlDocument xml = new XmlDocument();
			try {
				xml.Load(rulefile);
				foreach(XmlNode node in xml.DocumentElement) {
					if (node.Name.Equals("skills")) AddRules<IRuleSkill>(skills, typeof(RSkill), "skill", node);
					//if (node.Name.Equals("items")) AddRules<IRuleItem>(items, typeof(RItem), "item", node);
				}
			} catch(Exception ex) {
				Logging.error(ex);
				MBox.Fehler(null, "Fehler beim Parsen der Spielregeln");
			}
		}
		
		private static void AddRules<T>(Dictionary<string, T> rules, Type ruletype, string nodename, XmlNode basis) {
			foreach(XmlNode node in basis) {
				if (node.Name.Equals(nodename)) {
					XmlAttribute xa = node.Attributes["id"];
					if (xa == null) {
						StringBuilder sb = new StringBuilder();
						XmlNode b = node;
						while(b != null) {
							sb.Append(b.Name);
							if (b.ParentNode != null) sb.Append(".");
							b = b.ParentNode;
						}
						throw new RuleParserException("keine ID für '" + sb.ToString() + "'");
					}
					T rule = (T) Activator.CreateInstance(ruletype, new Object[] { node });
					rules.Add(xa.InnerText, rule);
				}
			}
			Logging.info(" - " + rules.Count + " " + nodename + "s");
		}
	}

01.10.2011 - 20:58 Uhr

Moin,

wollte ich doch mal Generics selber probieren und komme natürlich nicht weiter ... also

ich habe folgende Basis-Klasse welche Generics verwenden soll


	public class ARule<T> {
		
		public string ID { get; private set;  }
		public string Name { get; private set; }
		
		protected ARule(Dictionary<string, T> rules, XmlNode basis) {
			XmlAttribute xa = basis.Attributes["id"];
			if (xa == null) {
				StringBuilder sb = new StringBuilder();
				XmlNode b = basis;
				while(b != null) {
					sb.Append(b.Name);
					if (b.ParentNode != null) sb.Append(".");
					b = b.ParentNode;
				}
				throw new RuleParserException("keine ID für '" + sb.ToString() + "'");
			}
			foreach(XmlNode node in basis) if (node.Name.Equals("name")) Name = node.InnerText;
			// rules.Add(ID, this);
			rules.Add(ID, (T) this);
		}
	}

dazu noch ein Interface


	public interface IRuleSkill {
		
		// hier werden keine Methoden benötigt (aktuell) ... enthält alles
		// ARule
		
	}

und eine kleine Klasse die das Interface und die Basis-Klasse beerbt


	public class RSkill : ARule<IRuleSkill>, IRuleSkill {
		public RSkill(Dictionary<string, IRuleSkill> skills, XmlNode basis)
			: base(skills, basis) { }
	}

das Hinzufügen von RSkill ins Dictionary funktioniert nicht ... angeblich kann er ARule<T> nicht in T wandeln ... was ja eigentlich auch erstmal richtig ist ... aber die Instanz die ins Dictionary soll implementiert T - damit sollte es ja funktionieren


			// beide Varianten funktionieren nicht
			// rules.Add(ID, this);
			rules.Add(ID, (T) this);

hand, mogel

01.10.2011 - 18:24 Uhr

void getList(void** list)
void useList(void* list, ...)

wenn mich meine C Kenntnisse jetzt nicht ganz täuschen


void* meineliste;
// ..
getList(&meineliste);
// ..
useList(meineliste);

beim Ersten mal will die DLL nur den Pointer (bzw. die Adresse) haben wo Dein Pointer für die Liste liegt ... um dort die Adresse der Liste rein zuschreiben ... wie das genau in C# aussieht weis ich nicht ... ich greifen in den Fällen (wenn es dazu kommt) lieber auf C++/CLI zurück

hand, mogel

29.09.2011 - 21:14 Uhr

Die SEHException-Klasse behandelt SEH-Fehler, die in nicht verwaltetem Code ausgelöst werden, aber keiner anderen .NET Framework-Ausnahme zugeordnet sind. Die SEHException-Klasse antwortet auch auf das HRESULT E_FAIL, das den Wert 0x80004005 hat.

irgend was was nicht .NET ist - aber von .NET aufgerufen wird (GDI+/...) - macht Mist ... solltest Du externe DLL einbinden und ist es möglich das die Mist baut oder Du ihr falsche Daten gibt

hand, mogel

BTW: wie herbivore schon schrieb, eine Inner-Exception ist immer aufschlusreicher als die äußere ... also logge deren Ausgaben am besten auch mit

28.09.2011 - 17:37 Uhr

Wenn man aber eine Verbindung haben möchte, die nicht über den Server läuft, sondern der Server nur als Vermittler tätig ist, dann geht TCP nicht.

?? hä ??