Laden...
J
Jimpanse myCSharp.de - Member
Junior C# Entwickler C:\Windows\Temp Dabei seit 12.08.2008 130 Beiträge
Benutzerbeschreibung

Forenbeiträge von Jimpanse Ingesamt 130 Beiträge

23.09.2008 - 10:00 Uhr

schwierige Frage ! 🙂

23.09.2008 - 08:48 Uhr

sowas kannste doch auch selber programmieren, da bist du wohl schneller als wenn du ewig nach soetwas suchst...

ich würd dir eins machen, doch hab ich gerade (Zeit == 0) -> true

19.09.2008 - 15:18 Uhr

wie könnte ich am einfachsten die Whileschleife ersetzen? bzw. wie könnte ich das am besten lösen, das mein Überwachungsthread veränderungen in den Arrays festellen kann?

thx

19.09.2008 - 14:16 Uhr

Dankö, ich wollte sowieso noch schauen was es besseres gibt als es in ner while zu testen, aber für dieses Test wollte ich erstmal das Threadn bzw. das das mit den Arrays klappt prüfen. Das mit dem Singleton das flags setzen kann gefällt mir, werds mir mal anschauen, wird wohl ein langes WE 🙂

Danke echt, bin für jeden Tipp dankbar.

19.09.2008 - 14:07 Uhr

danke eichhoernchen, volatile hab ich mal wieder entf, aber irgendwie funktioniert der code schon wieder so wie vorher, ich bin mal fleißig am debuggen.

danke nochmal an alle 👍

19.09.2008 - 13:49 Uhr

danke für deine Mühe 👍

ich hab jetz ein problem gelöst,
wie du gesagt hast habe ich ein eigenes Lock-Object deklariert

private Object thisLock = new Object();

und locke die methoden jetz so anstatt direkt auf die Member, aber jetz hab ich halt das problem das meine auftragmethode (siehe weiter oben: pseudo_auftrag()) jetz nur einmal ausgeführt wird, wenn ich jetzt 2 aufträge starte dann arbeiten die Hintereinander, was eigentlich nicht so sein sollte, sonder sollten diese gleichzeitig arbeiten, u nd immer wenn die an eine Variable kommen die für alle ist, sollte nur die eine Methode zugriff darauf haben um da ggf was zu schreiben.

Wie könnte ich das bitte hinbekommen ?!

Danke und gruß!

19.09.2008 - 13:30 Uhr

Anstelle der int-Arrays würde sich an der Stelle eine List<int> anbieten, da könntest du direkt per .Add() einfügen, ohne vorher eine neue Liste zu machen, umzukopieren usw.

die Int-Arrays sind nur zu demozwecken, weil ich das mit den Threads erstmal testen wollte und wenn es dann funkt, werde ich es in mein Projekt importieren 🙂

anstelle der Int-Arrays sollen die daten in eine DB geschrieben werden, aber im moment zum testen reichen mir die arrays.

19.09.2008 - 13:28 Uhr

Danke BhaaL !

werde mal deine Tipps genauer untersuchen, ich habe in der Zeit im Galileo Computers Openbbok "Visual C#" nachgelesen und folgendes gefunden:

Der Monitor kann für ein bestimmtes Objekt nur ein einziges Mal vergeben werden. Greifen mehrere Threads auf mehrere synchronisierte Methoden desselben Objekts zu, muss der Thread, der als Erster die Sperre erhalten hat, seine Operationen vollständig abschließen, bevor der zweite Thread das Recht auf den Monitor erhält.

kann das nicht auch mein Problem sein ?!

danke schonmal !

19.09.2008 - 13:07 Uhr

Hi und Servus,

ich habe mal wieder ein Problem 😭 und zwar habe ich 2 Arrays (für Auftragsnummern und eins für Operationsnummern) die von mehreren Threads benutzt werden, ein Thread prüft immer in einer Schleife ob sich die werte in den Arrays verändert haben (Methodenname: thread_produktion()), zusätzlich wird immer ein neuer Thread gestartet wenn ein neuer Auftrag erstellt wird (button_click =>einen auftrag starten) In der Auftragmethode wird dann in die Arrays, der neue Auftrag geschrieben und auch immer der aktuelle Operationsname.

Damit die Threads nicht alle gleichzeitig auf die beiden Arrays zugreifen habe ich diese mit lock gekapselt.


...
public static volatile int[] joblist = new int[0];
public static volatile int[] operationlist = new int[0];
public volatile int auftragsnummer = 1000;
...
...
...
...
private void thread_produktion()
        {
           
            //muss die laufende Produktion ueberwachen
            bool produktion_lauft = true;

            int[] old_joblist = new int[0];
            int[] old_operationlist2 = new int[0];
            
            while (produktion_lauft)
            {
                lock (joblist)
                {
                    if (ArraysEqual(joblist, old_joblist) == false)
                    {
                        old_joblist = joblist;//hier wieder das temporaere vergleichsarray aktuell setzen damit
                        //die naechste Veraenderung erkannt werden kann

                        //** hier muss noch die Graphenzeichnung neu gezeichnet werden
                    }
                }//ende lock(joblist)

                lock (operationlist)
                {
                    if (ArraysEqual(operationlist, old_operationlist2) == false)
                    {
                        
                        old_operationlist2 = operationlist;//hier wieder das temporaere vergleichsarray aktuell setzen damit
                        //die naechste Veraenderung erkannt werden kann
                        
                        //** hier muss noch die Graphenzeichnung neu gezeichnet werden
                    }
                }//ende lock(operationlist)
                
                Thread.Sleep(1);
                
            }


        }



Wenn ich schrittweise debugge und bei Thread.Sleep(1); ankomme, dann ändert sich auf einmal der Wert von old_operationlist2 in den aktuellen von operationlist, obwohl die if (ArraysEqual(operationlist, old_operationlist2) == false) zuvor true zurückgegeben hat und deshalb die Operation old_operationlist2 = operationlist; nicht ausgeführt werden kann ! bin schon echt am verzweifeln warum das nicht hinhaut ;/

hier noch der Code von der Methode zur ArraysEqual und die Methode um einen Auftrag zu starten (der Auftrag wurde nur für demozwecke programmiert, also nicht wunder 😉 )


// -- Methode: ueberpruefen ob Arrays identisch sind
        public static bool ArraysEqual(Array a1, Array a2)
        {
            if (a1 == null || a2 == null || a1.Length != a2.Length)
            {
                return false;
            }

            IList list1 = a1, list2 = a2;

            for (int i = 0; i < a1.Length; i++)
            {
                if (!Object.Equals(list1[i], list2[i]))
                {
                    return false;
                }
            }

            return true;
        }


void pseudo_auftrag()
        {
            
            
            
            lock (joblist)
            {
                int[] temp = joblist;
                joblist = new int[temp.Length + 1];
                
                temp.CopyTo(joblist, 0);
                joblist[temp.Length] = auftragsnummer;
            }
            lock (operationlist)
            {
                int[] temp_operationlist = operationlist;
                operationlist = new int[temp_operationlist.Length + 1];
                temp_operationlist.CopyTo(operationlist, 0);

            }
            int jobnr = auftragsnummer;
            auftragsnummer++;

//Auftragsnummer setzen
            int[] nummern = new int[] { 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113 };



            for (int i = 0; i < nummern.Length; i++)
            {
                StarteAuftragClass.current_process = nummern[i];

                lock (joblist)
                {
                    for (int co = 0; co < joblist.Length; co++)
                    {
                        if (joblist[co] == jobnr)//suche bei welchem Index der Auftrag zu finden ist
                        {
                            lock (operationlist)
                            {
                                operationlist[co] = nummern[i];//aktuelle Operationsnummer setzen, bei gleichem Index wie in der joblist!
                            }
                        }
                        break;
                    }
                }//ende lock(joblist)

                //Do Something 
                Thread.Sleep(800);

                if (i == nummern.Length - 1)//wenn das die letzte Operation war, dann ende
                {
                    lock (joblist)
                    {
                        for (int a = 0; a < joblist.Length; a++)
                        {

                            if (joblist[a] == jobnr)
                            {
                                
                                joblist[a] = 0;
                                int[] temp2 = new int[joblist.Length - 1];
                                int zaehl = 0;
                                foreach (int s in joblist)
                                {
                                    if (s != 0)
                                    {
                                        temp2[zaehl] = s;
                                    }
                                }
                                joblist = temp2;
                                

                                lock (operationlist)//die operation vom beendeten Auftrag aus der Operationlist loeschen
                                {                  //und dementsprechend kuerzen
                                    operationlist[a] = 0;
                                    int[] temp2_operationlist = new int[operationlist.Length - 1];
                                    int zaehl2 = 0;
                                    foreach (int s in operationlist)
                                    {
                                        if (s != 0)
                                        {
                                            temp2_operationlist[zaehl2] = s;
                                        }
                                    }
                                }//end lock(operationlist)
                            }

                        }
                    }//ende lock(joblist)

                    StarteAuftragClass.auftrag_laeuft = false;
                    MessageBox.Show("ENDE");
                }
            }



        }


Dankeschonmal für eure Hilfe ! ich weiß echt nicht wie ich sonst die Auftragsthreads mit meinem Überwachungsthread syncen kann 😭 habs erst mit lock alleine versucht, später hab ich dann die Variablen noch volatile gesetzt aber das bringt nichts.

Gruß
Jimmy

16.09.2008 - 11:17 Uhr

jo also Dijkstra hab ich mir schon länger vorgemerkt und hab vorhin auch Quickgraph gefunden, das kann ua. auch den Dijkstra 🙂 fürs zeichnen ist das Ding hauptsächlich. Leider kann ich die lib nicht einbinden, da man noch graphviz und vieles mehr installieren muss da hab ich dann schon den Überblick verloren oO

[Link zu Quickgraph: http://www.codeplex.com/quickgraph]

Mein Kopf raucht zur Zeit echt übel -_- ich versuche jetz mal die Graphen zu verbinden, die Graphen sind mit der Forward-Star Speicherung in einer Db abgelegt. Mal gugn.

Danke.

16.09.2008 - 09:07 Uhr

Hi und Servus !

ich arbeite gerade an einem Projekt bei dem ich mehrere Graphen zu einem Graphen hängen muss.

ich habe einen Auftrag dessen Arbeitsschritte in einem Graphen abgelegt werden. Wenn man jetzt 2 Aufträge startet sollen beide Aufträge aneinander gehängt werden (später sollen dann kürzeste Wege berechnet werden). Dafür suche ich einen entsprechenden Algorithmus oder Anlaufstellen.

Ich habe mal noch ein Bild angehängt wie es dann ausschauen sollte.

Danke schonmal !

Gruß

16.09.2008 - 08:55 Uhr

cool, danke für die Links !

16.09.2008 - 08:36 Uhr

ja, einfach einen Bool zb. bool Funktion_gestartet = false;

if(Funktion_gestartet==false)
{
   ...starte Funktion...
   Funktion_gestartet = true;
}

ferdisch 🙂

15.09.2008 - 14:50 Uhr

@BerndFfm: gracie 😉 SQl Compact werd ich mir mal angugn, im moment brauche ich keine DB für meine Projekte aber gut zu wissen was gute Anlaufstellen sind 🙂

Gruß

15.09.2008 - 14:47 Uhr

"oder die englische übersetzung." der ist gut ^^

@topic: hab leider auch keine Ahnung ;/

15.09.2008 - 14:38 Uhr

Also ich hab da mal das ganze komplett paket installiert (VS 2008 Pro mit allem drum und dran)

gut zu wissen das man den Sqlserver nicht unbedingt braucht 🙂
das bisschen kann ich nämlich auch mit der accessdb machen wenn ich mal
ne kleine db brauch.

Da mache ich dann mal ans deinstallieren 🙂

Gruß
Jim

12.09.2008 - 21:15 Uhr

ah, danke für eure Hilfe... wie kann man das denn unter XP ändern ?

Ich hatte echt ewig versucht im VS das umzustellen, dann bin ich auf die grandiose Idee gekommen VS neuzustarten 🙂

Ich war echt froh das das danach wieder gefunkt hatte ^^

THX nochmal

12.09.2008 - 13:58 Uhr

Hi Servus !

ich habe gerade während des Programmierens (VS 2005) einige Hotkeys gedrückt und bin wohl ausversehen auf einen gekommen der mir das Tastaturlayout von EU auf USA umgestellt hat, jetz kann ich nicht mehr Kommentieren (auf der 7 kommt das &-Zeichen) auf Z, das Y und auf Y das Z usw.

Kann mir Jemand helfen wie ich das Layout wieder zurückumstellen kann ? unter Extras -> Optionen -> Tastatur finde ich keine derartige Einstellung.

Dank schonma für Eure Hilfe, ich brauch unbedingt wieder das normale Layout sonst kann ich nicht weiter programmieren -.-

THX

Jim

==============
EDIT:

Nach einem Neustart gings wieder normal -.-

sorry für dich Umstände, bin echt übermüdet....

==============

kann geclosed werden.

Grüßle
Jim

08.09.2008 - 22:32 Uhr

ja ich zeichne den Baum ja selber, aber halt in einem anderen Form und danach mache ich einen Screenshot, oder kannst du mir sonst sagen wie ich das anders Zoomen hinbekommen kann ?

08.09.2008 - 13:58 Uhr

Servus miteinander,

ich habe ein Problem, leider finde ich dazu echt nichts im Internet und die MyCsharp-Suche geht grad nicht weil der sqlserver rumspackt -.-

Problem:

ich möchte einen Screenshot eines Forms machen und diesen als BMP in einer PictureBox ausgeben. Den Screenshot kann ich von der Form machen, aber leider bekomme ich nur einen Screenshot des leeren forms. Wenn ich die Form mit Form.Show() aufrufe und danach das Bild mache dann ist der Inhalt auch dabei, das Form soll aber nicht erscheinen sondern das Programm soll intern das Form öffnen und dann den Screenshot in die Picturebox machen.

gibt es eine Möglichkeit die Form.Show() Methode mit DrawToBitmap umzukonvertieren ? ohne das sich das Fenster öffnet?

Hier noch der Code:


PictureBox baum = new PictureBox();

Bitmap bmp = new Bitmap(500, 1000);
            
            Form myform2 = new Draw_Tree_Form();
            //myform2.Show() funktioniert nicht mit DrawToBitmap
            myform2.DrawToBitmap(bmp, (new Rectangle(0, 0, 1000, 1000)));
            
            baum.Size = new Size(bmp.Size.Width, bmp.Size.Height);           
            baum.Image = bmp;
            
            //Mainpanel
            panel1.Controls.Add(baum);


Ich mache diesen Umweg da ich in meiner MainForm ein Panel habe wo ein Baum reingezeichnet werden soll. Mein Problem ist das es möglich sein soll in diesem Panel zu Zoomen. Deshalb konvertiere ich die Form in ein Bild und tu es dann in eine PictureBox. Oder gibt es auch möglichkeit in einem Form oder Panel zu zoomen ?! ich habe leider nichts dazu gefunden.

Danke schonmal für eure Hilfe 👍

Gruß
Der Affe

05.09.2008 - 11:11 Uhr

mach halt einfach ne Kombination mit MouseHover 😉 ansonsten hab ich auf die schnelle auch kein Ahnung 🤔

05.09.2008 - 11:03 Uhr

am besten auch noch bisschen Code 👍

05.09.2008 - 09:59 Uhr

echt nur integer ? mhhh ich hab zwar auch schon welche benutzt (Trackbars) aber habe nie dazu float gebraucht, evtl eigenes proggen ?! hab mal Dr. Google gefragt der hat auch nichts dazu gewusst -.-

02.09.2008 - 10:24 Uhr

meine Fresse geht das hier schnell mit den antworten, jetz wollt ich doch das was der Herbi geschrieben hat auch schreiben schnief

wegen: Folgende Warnungen oder Fehler sind aufgetreten:

* In dem Thema wurde in der Zwischenzeit mindestens ein neuer Beitrag erstellt. Du solltest deinen Beitrag überprüfen und ihn gegebenenfalls anpassen.  

hab ich das dann gesehen ... ist echt schwer hier zu helfen wenn andere noch schneller sind 😮

28.08.2008 - 14:00 Uhr

@Scarecraft :

möchtest du ne art Rpgmaker kopie machen ?? 🙂)) ich würd dir helfen 👍OO

Grüßle

20.08.2008 - 12:47 Uhr

Super TUT 👍

danke für die gute Arbeit 🙂

12.08.2008 - 11:56 Uhr

[...] Am besten setzt Du ein Panel in dem der Inhalt später angezeigt wird. Angenommen Du hast ein Form1 und ein Form2, wobei Form2 einen möglichen Content darstellen soll. [...]

super, danke 👍

hat mir sehr weitergeholfen 🙂