Laden...

Forenbeiträge von Myth Ingesamt 22 Beiträge

20.09.2010 - 11:58 Uhr

Notwendigkeit
Für eine Serveranwendung die ich programmieren muss - soll es möglich sein immer alle physischen CPU-Kerne optimal auszunutzen, als programmiersprache wir keine .Net Sprache genutzt (performanceansprüche und portabilität) deswegen kann ich den .Net Task-Scheduler nicht nutzen.

Anforderungen
-Hinzufügen von sogenannten "Tasks" die abhängigkeiten auf andere zuvor ausgeführte tasks aufweisen
-Automatische ermittlung des Tasks der als nächstes ausgeführt wird sobald ein physischer CPU-Kern frei wird, kritierien sind hierbei Abhängigkeiten und die Priorität:

TASKPRIORITY_AUTO = auto-detect task priority depending on task dependencies
TASKPRIORITY_HIGH = execute task first if other tasks waiting for this operation
TASKPRIORITY_TIME_CRITICAL = ignore all task dependencies and execute this task first (if physical is core avaible)

-Die möglichkeit Tasks Paralel auszuführen (dem Task Scheduler wird eine funktion mitgegeben die Thread-sicher ist die dann z.B bei 3 freien CPU-Cores 3x aufgerufen wird.)
-Das Festlegen ob der Task viel Rechenzeit benötigt, um Z.b bei io-operations trotzdem mehr tasks als Physische Kerne zu starten

Das wars auch schon 😉

Implementierung
An meinem Implementierungskonzept darf gerne Kritik geübt werden (deswegen poste ich es ja auch hier) - da meine "theoretische implementierung" mir nicht zusagt.

Klasse ScheduledTask bildet intern einen Task mit den in den "Anforderungen" aufgelisteteten eigenschaften (Eigenschaften, Priorität, Abhängikeiten)

Klasse ThreadScheduler implementiert einen thread-sicheren singleton damit von allen Threads auf ihn zugegriffen werden kann.
Der ThreadScheduler besitzt die Methode AddTask die einen Task der TaskQueue hinzufügt nach beenden und dem hinzufügen eines Tasks soll anhand der oben genannten Kriterien der als nächstes auszuführende Task ausgeführt werden.

Problemstellung

  1. Effiziente auswahl des als nächstes auszuführenden Task

Methode1:
Bei Beenden& hinzuf+gen wird die "TaskQueue" nach den oben genannten Kriterien sortiert, danach wird der erste in der "TaskQueue" vorhandene Task ausgeführt
Methode2:
Iterieren durch die TaskQueue nach den oben genannten Kriterien bis ein Task gefunden wurde, dieser wird dann ausgeführt. 2. Abhängigkeiten
Um Abhängigkeiten zu ermöglichen muss man alle Tasks immer im speicher halten damit man auch nach beendung feststellen kann ob der Task ausgeführt wurde

Für alles offen 😉
Grüße aus Münster - Tobias

25.08.2010 - 11:18 Uhr

Das letzte mal, wenn jemand dazu noch etwas weis 😉

19.08.2010 - 03:59 Uhr

/Push*

17.08.2010 - 17:40 Uhr

Korpklaani
Rammsetin
Eluveitie
Amon Amarth
Equilibrium
Eisregen


DAS ist Musik 😄

grundsätzlich genau das was .Net entwickler hören sollten 😉

zwar kenne ich nur Amon Amarth, Rammsetin, Korpklaani - davon die Musikrichtung stimmt aber 😉

17.08.2010 - 13:35 Uhr

SciLexer ist die Bibliothek die ScinTilla.net
kapselt, aursprünglich ist sie in c++ geschrieben.

Um mit Scintilla.net zu arbeiten musst du die Datei in den Ordner "system32" kopieren, ausserdem solltest du die Datei deinem Projekt hinzufügen und unter Eigenschaften "In das Build-Verzeichnis kopieren auswählen".

16.08.2010 - 15:20 Uhr

Wenn du nur mit dem Hauptformular arbeiten möchtest funktioniert das auch 😉

Form lTestForm = (Form)Control.FromHandle(Process.GetCurrentProcess().MainWindowHandle);

auch gerade ausprobiert 😉

16.08.2010 - 15:12 Uhr

Ja, das ist möglich:

Wir implementieren einen Singleton-Pattern im Formular:


#region singleton implementation
        private static volatile F_Plugins instance;
        private static object syncRoot = new Object();
        public static F_Plugins Instance
        {
            get
            {
                if (instance == null || instance.IsDisposed)
                {
                    lock (syncRoot)
                    {
                        if (instance == null || instance.IsDisposed)
                            instance = new F_Plugins();
                    }
                }

                return instance;
            }
        }
        #endregion

Im "Plugin" sagen wir nun:


Assembly lEntryAssembly = Assembly.GetEntryAssembly();
            Type[] lExportedTypes = lEntryAssembly.GetExportedTypes();
            
            foreach (Type lType in lExportedTypes)
            {
                if (lType.Name == "F_Plugins")
                {
                    Form lForm = (Form)lType.GetProperty("Instance").GetValue(lType, null);
                    lForm.Text = "Test123";
                    break;
                }
            }

Ich habe mir die Lösung gerade erst ausgedacht da ich sowas sicherlich auch mal bracuhen werde. Es ist unsauber an vielen stellen und wenn man damit richtig arbeiten möchte gibt es sicherlich noch optimierungsbedarf (ggf über ein eigenes Interface für "F_Plugin") dann kann man sich den weg über Reflection sparen.

Funktionieren tut es - gross getestet habe ich es aber nicht.

Ich weis nicht ob man Forms einen Singleton-Pattern reindrücken "sollte" ich finde es aber in vielen fällen einfach praktisch wenn man das Formular sowiso nur maximal 1x benutzen möchte.

Weitere Informationen zu Singleton-Patterns findest du hier:
http://en.wikipedia.org/wiki/Singleton_pattern#C.23

16.08.2010 - 13:39 Uhr

Ich benutze zum Drucken immer das WebBrowser-Control, übergebe HTML-Code und führe die Print() Methode aus.

Soviel flexibilität bietet nichtmal Crystal Reports 😉

16.08.2010 - 13:32 Uhr

Der Aufruf unterscheidet sich vom APICodePack, das Interface und der SafeHandle sind identisch (es wurden nur anpassungen für .Net 4.0 vorgenommen: "SecurityTreatAsSafe" --> "SecuritySafeCritical") welches das equivalent zu "SecurityTreatAsSafe" in .Net 4.0 darstellt.

gröstenteils habe ich mich an http://windows7taskbarext.codeplex.com/SourceControl/changeset/view/10156#140881
orientiert welches ohne Komplikationen funktioniert.

Am Aufruf kann man ja eigentlich nicht viel falsch machen:

MainWindowhandle ermitteln
Aus einem Bitmap ein SafeHandle erstellen

Die gekapselte COM-Funktion

void SetOverlayIcon(
            [In] IntPtr hwnd,
            [In] SafeHandle iconHandle,
            [In] string description);

aufrufen.

Anmerkung: SetProgressValue(...) und SetprogressState(...) funktionieren tadellos.

16.08.2010 - 13:21 Uhr

Ja und - schon getan, festgestellt das mein Code nahezu identisch wie der im CodePack ist.

Danke trotzdem!

16.08.2010 - 12:34 Uhr

Ganz vergessen... Ich erkenne aus der Ausnahme nicht wirklich viel doch vieleicht hatte da jemand schon ähnliche Vorfälle:

16.08.2010 - 12:18 Uhr

Guten Morgen 😉
Bin an dem Punkt angelangt wo ich selber nicht mehr weiterweis und da mir kein anderer helfen kann stelle ich die Frage nun doch hier 😉

Vorwort:
Mir geht es nicht darum das ich die Funktion unbedingt brauche, nur darum das es mich selbst ärgert die Lösung/ den Fehler nicht finden zu können - bräuchte ich nur die Lösung würde ich eine der vielen Bibliotheken verwenden die im Internet zu finden sind und die ich mir auch schon als Beispiel im Code angeschaut habe.

Zielsetzung
Setzen eines OverlayIcons welches über dem aktuellem Taskbarbildchen(?) angezeigt wird mithilfe der gestellten API für das Entwickeln von Windows7 Applikationen - kurz gesagt das [http://pastebin.com/i95HwjdT"]COM-Objekt]() welches funktionen für die Windows7 TaskBar implementiert.

Fehler/ Problem
COM-Objekte bescheren mich mit coolen exceptions die ich mir nicht erklären kann und woraus ich wenig Schlüsse zur Ursache des Fehlers ziehen kann.

Vorgehen
Interface für das COM-Objekt anlegen
SafeHandle implementierung für den Aufruf dieser COM-Funktion schreiben

        void SetOverlayIcon(
            [In] IntPtr hwnd,
            [In] SafeHandle iconHandle,
            [In] string description);

Instanz des COM-Objekts erstellen

public ITaskbar TaskBarInterface = (ITaskbar)Activator.CreateInstance(Type.GetTypeFromCLSID(new Guid("56FDF344-FD6D-11d0-958A-006097C9A090")));
        

Funktion Aufrufen

public void SetOverlayIcon(Bitmap TaskBarIcon, String Description)
        {
            TaskBarIcon = Properties.Resources.Error;
            var lIconHandle = TaskBarIcon == null ? new IconHandle() : new IconHandle(TaskBarIcon.GetHicon());
            
            if (lIconHandle.IsInvalid)
                throw new ArgumentException("Icon is Invalid!");

            try
            {
                this.lTaskBarInterface.SetOverlayIcon(Process.GetCurrentProcess().MainWindowHandle, lIconHandle, String.Empty);
                
            }
            catch (COMException ex)
            {
                if (ex.ErrorCode == -2147467259)
                    return;
                else
                    throw;
            }
        }

Ich hoffe ich habe mich verständlich ausgedrückt - bei Unverständniss/ Fragen und vorallem Lösungsvorschlägen Ideen und Erfahrungsberichten einfach per PM/ hier im Thread posten 😉

Der der sich schon mit der Windows7 Taskbar COM-API auseinandersetzen musste wird sicherlich merken das die Schnittstellenimplementierung& die des SafeHandles nicht von mir ist.

16.08.2010 - 11:40 Uhr

Delphi? Delphi ist win32, dort kannst du keine .Net Assemblies verwenden.

Wenn du Delphi.Net meinst kannst du alle Libarys die du im Internet findest benutzen.

http://www.colorpilot.com/pdflibrary.html hört sich doch schonmal gut an 😉

16.08.2010 - 11:36 Uhr

Als ich 12 war habe ich programmierer immer als Vorbild gesehen 😉

Programmieren "gelernt" bzw es angefangen habe ich mit einem Brick-Shooter in Delphi32 (ihr wisst schon unten einen Balken mit dem man einen Ball immer wieder nachoben schiest)

Das war ein Projekt was mich vollkommen überfordert hat - so ist es dann meistens immer bei neueren Projekten gewesen, einfach anfangen und wenn man auf etwas stösst was man noch nicht kennt weis google meistens die Lösung für dich.

So gewinnt man Praxiserfahrung, Übung und was das wichigste ist - man lernt wie man sich selbst eine Lösung erarbeiten kann was meiner Meinung das wichtigste in der Programmierung ist - man kann nie alles wissen/ alles können denn man lernt nie aus.

Deswegen meine ich auch - niemand kann sagen ich kann schon "C++, PHP, ..." sondern nur "Ich habe schon Erfahrung mit C++, PHP, ... " oder eine Ähnliche Formulierung.

lg Mythli <3

30.07.2010 - 11:39 Uhr
if (!this.DesignMode)

Ist klar, trotzdem noch ein danke von mir =)

29.07.2010 - 22:08 Uhr

Morgen, einfache Frage wo ich leider nicht weis nach was ich suchen muss 😉

Wie kann ich eine Funktion davor schützen in "Designtime" ausgeführt zu werden?

19.07.2010 - 11:42 Uhr

Das Programm das lesen soll...

            XmlDocument lTestXmlDoc = new XmlDocument();
            lTestXmlDoc.Load(File.OpenRead("xmldatei.xml"));

Das Programm das schreiben soll...



            XmlDocument lTestXmlDoc = new XmlDocument();
            lTestXmlDoc.Load(File.OpenWrite("xmldatei.xml"));

05.07.2010 - 23:51 Uhr

Die Adresse des RSS-Feeds: http://mythli.ath.cx/websvn/wsvn/VisualAI/?op=rss&isdir=1&

Das mit den 2-klicks weis ich nur irgendwie habe ich immer draufgeklickt und erwartet das er mir jetzt die feeds anzeigt 😉

05.07.2010 - 16:57 Uhr

Ertmal vorweg vom Design hat mich die Anwendung überzeugt - leider bleibt das programm bei Feedupdate einfach stehen was die benutzung unmöglich macht.

Feature:
Bei klick auf dass Icon Feeds anzeigen

16.06.2010 - 12:16 Uhr

Mir bekannt, danke trotzdem! - Doch bei Defaultwert "Empty String" sollte ich da nicht einen leeren String zurückbekommen?

Ja aber ich würde es gerne vermeiden bei jedem feld eine Fehlerbehandlung hinzuzufügen.

16.06.2010 - 12:09 Uhr

Morgen zusammen, wie gewöhnlich ist der erste Post in einem Forum wo man noch nie war eine Frage und hier kommt sie:

Ich habe eine Datenstruktur in der es öfters vorkommt das Felder leer sind und als Default-Wert "Empty String" ausgewählt ist.

Lasse ich mir einen Wert via

lDataReader.GetString("name");

zurückgeben und dieser auf dem Defaultwert steht bekomme ich eine "System.NullArgumentException" obwohl eigentlich einfach ein leerer String zurückgegeben werden sollte (wie auch in MySql Connector for .Net beschrieben ist)

Darauf habe ich lange im Internet gesucht und auch Verschiedenes (unter anderem ) gefunden das dies mal ein Bug war der aber eigentlich in meiner benutzten Version (Connector/Net 6.2.3) nicht mehr existent sein sollte.

Keine Ahnung wie ich damit umgehen soll/kann denn einfach bei jedem "GetString("")" einen try { } catch(Exception ex) { } zuschreiben ist leider keine Option

Würde mich über Lösungsvorschläge/Erfahrungsmeldungen freuen 😉