Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von bhelbig
Thema: Literal string aus Datenbank laden
Am im Forum: Datentechnologien

Oh man ich bin ja so doof. Manchmal sieht man den Baum vor lauter Wald nicht. Es war ein doofer Tippfehler im Pfad.

Danke für die Hilfe und Geduld.

Grüße

Thema: Literal string aus Datenbank laden
Am im Forum: Datentechnologien

Da hast du Recht. Das hatte ich gelesen, der User ist aber Authentifiziert. Der Zugriff funzt ja auch, wenn ich den Directory String in der App hinterlege. Würde es an der Auth liegen dann würde das ja auch schon nicht klappen.
Das Prob. tritt immer auf, egal ob Service oder App.

Thema: Literal string aus Datenbank laden
Am im Forum: Datentechnologien

Hi Tom,

danke für den Tipp, war vielleicht ein Missverständnis, aber bin extra im DB Forum, da das Problem nur auftritt, wenn ich den UNC Pfad aus der DB auslese. Gebe ich ihn über eine Textbox durch den User an funktioniert es.
Ich glaub ich dreh mich im Kreis
Da wird man ja noch ganz konfus. X(

Thema: Literal string aus Datenbank laden
Am im Forum: Datentechnologien

Hi thomas.at

ist klar.

Es gibt ein Share

\\fileserver\share
welches z.B. auf Laufwerk
J
verbunden ist.
In diesem Share liegt wiederum ein Ordner
folder
.
Folgender Code funzt, liefert also

true
zurück.


if (Directory.Exists(@"J:\folder"))
{....}
Folgender funzt allerdings nicht:


if (Directory.Exists(@"\\fileserver\share\folder"))
{...]

Und das kapier ich nicht. Der User, der das Prog oder den Service ausführt hat Vollberechtigung auf den Share und den Ordner.

Thema: Literal string aus Datenbank laden
Am im Forum: Datentechnologien

Hmm, jetzt wirds seltsam. Wenn ich ein


Directory.Exists(@"J:\Ordner");
mache bekomm ich ein TRUE

Mach ich das ganze auf


Directory.Exists(@"\\fileserver\Ordner");

bekomm ich ein false.

Jetzt steh ich vollkommen auf dem Schlauch. Kommt die Directory.Exists Methode nicht mit UNC Pfaden klar? Im MSDN steht nix drin.

Sehr seltsam.

Grüße

P.S.: Die Rechte sind vollkommen OK. Also der User hat volle Rechte.

Thema: Literal string aus Datenbank laden
Am im Forum: Datentechnologien

Wenn dem tatsächlich so ist, dann frage ich mich, warum


Directory.Exists(strPath1);
immer false zurückliefert obwohl der Ordner \\fileserver\freigabe existiert.

Hast du da eine Idee?

Thema: Literal string aus Datenbank laden
Am im Forum: Datentechnologien

verwendetes Datenbanksystem: MS SQL 2005

Hi,

ich hab folgendes Problem. Ich hab in einer DB eine Config Tabelle. Dort liegen verschiedene Pfad drin (UNC und absolut).
Z.B.: \\fileserver\freigabe

Lese ich diese Spalte aus und weise sie einer String variablen zu:


string strPath1 = drRow["column"].ToString();
dann speichert er mir in der Variable folgenden Wert: \\\\fileserver\\freigabe

Ich hab schon alle mir bekannte versucht, dazu zählen replace, @ vor die variable und/oder vor drRow aber es hat nix geholfen.

Könnt ihr mir auf die Sprünge helfen wie ich den Wert des Pfades korrekt aus der DB lesen kann? Ich brauche ihn für die die Directory und File Operationen.

Grüße

Ben

Thema: Dienst startet nicht
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Also,

jetzt wirds vollkommen abstrus. Hab das mit dem RemoteDebugger hinbekommen. Ziemlich cool das Feature, nur leider in meinem speziellen Fall nicht zu verwenden, da ich mich ja nur an bereits laufende Prozesse connecten kann. Der Dienst startet jedoch garnicht erst.

Dafür bekomm ich jetzt endlich eine Fehlermeldung ins EventLog eingetragen:

EventType clr20r3, P1 cleoservice.exe, P2 2.0.0.0, P3 4a7bcbbb, P4 cleoservice, P5 2.0.0.0, P6 4a7bcbbb, P7 39, P8 11, P9 system.typeinitialization, P10 NIL.

Das spannende ist auch hier: Der Service funzt einwandfrei auf den Dev Maschinen, auf allen anderen nicht. In google war was gestanden von wegen korrupter .net Framework Installation, aber die kann ja nicht auf allen Maschinen korrupt sein, dass wäre schon zu viel des guten

Was ich halt komisch finde ist, dass der Fehler auch auftritt wenn ich in der Start Methode des Services alles auskommentiere und auch alle Objektinitialisierer auskommentiere.

Hast du noch eine Idee? System.TypeInitialization klingt für mich gefährlich nach einem vergessenen ExceptionHandler, aber das kann ich ausschließen, zumindest was meine eigenen dlls angeht

Grüße

Thema: Dienst startet nicht
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ja das dachte ich eigentlich auch, dass der Dienst abstürzen müsste und ich eine .net Fehlermeldung im Ereignisprotokoll haben müsste.

Ich hab VS 2008 Prof und .net 3.5. Windows 2003 x64 ist das ServerOS wo der Dienst laufen soll.

Die Sache mit dem Remotedebugger wäre meine nächste Frage gewesen. Wie kann ich einen Dienst debuggen. Hab da bisher nix gefunden. Werd mal nach Remotedebugger suchen. Wenn du da ein paar Tipps hättest wäre ich dir dankbar.

Grüße

Thema: Dienst startet nicht
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

hi kleines_eichhoernchen,

gute Idee. Hab glaub ich auch den Fehler gefunden, weiß aber nicht wie ich ihn rausbekomme. Wenn ich mir die Projekteigenschaften anzeigen lasse, unter dem Punkt "Veröffentlichen" und "Anwendungsdateien" dort werden mir Dateien angezeigt die er auch in den Release und Debug Ordner legt, die aber nirgends im Projekt verwendet werden. Hab da z.B. eine EMailConnector.dll drin, die verwende ich aber in einem ganz anderen Projekt und nicht in diesem Service. Die enthält nämlich ein Windows Form und Crystal Reports. Und da auf dem Server Crystal nicht installiert ist kommt der Fehler.
Was ich nicht verstehe ist, dass in den Verweisen und Projektabhängigkeiten das EMailConnector Projekt gar nicht drin ist. Ich weiß nicht woher er sich das noch zieht.

Hoffe du hast noch eine Idee wie ich das rausbekomme bzw. entfernen kann.

Grüße

Thema: Dienst startet nicht
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo zusammen,

ich habe folgendes Problem: Ich hab einen Services programmiert inklusive Installer.
Installiere ich den Service auf einer Entwicklungsmachine funktioniert er einwandfrei, auf jedem anderen Rechner aber nicht.
Der Service lässt sich aber sehr wohl installieren, taucht auch im Dienste Manager von Windows auf, aber wenn ich den Dienst starte kommt die Meldung, dass der Dienst nicht rechtzeitig auf die Anweisung reagiert hat und er startet auch nicht. Im Eventprotokoll steht der selbe Fehler (EventID 7000) + ein weiterer: Der Dienst hat nicht innerhalb des Zeitlimits(30000) auf den Verbindungsversuch geantwortet (EventID 7009)
Ich habe jetzt schonmal so ziemlich alles auskommentiert was als Code drin ist und es geht immer noch nicht.
Mir scheint, als ob irgend eine dll fehlt, aber die gefundenen Abhängigkeiten im VS Setup Projekt sind OK.
Habt ihr noch eine Idee wie ich herausbekommen kann was das Prob ist?

Grüße

Ben

Als Anmerkung mal hier mein Code für den Dienst:



        public CLEOServerService()
        {
            InitializeComponent();
            //if (!EventLog.SourceExists(ServerConfig.EventLogSourceName))
            //    EventLog.CreateEventSource(ServerConfig.EventLogSourceName, ServerConfig.EventLogName);
        }

        protected override void OnStart(string[] args)
        {
            // Start the networking thread
            //ServerConfig.NetworkThreadState = TypeDef.ThreadState.RUNNING;
            //tCleoNetworking = new Thread(new ThreadStart(tnsNetworking.Start));
            //tCleoNetworking.Start();
            EventLogManager.WriteEvent("Server service: CLEO Server is running",
                                       EventLogEntryType.Information, EventLogManager.EventMainGroups.CLEOSERVER_SERVICE);
            //EventLog.WriteEntry(ServerConfig.EventLogSourceName, "Server service: CLEO Server is running", EventLogEntryType.Information, 0);

            // Start the hygrometer monitoring thread
            //ServerConfig.HygroMeterThreadState = TypeDef.ThreadState.RUNNING;
            //tCleoHygroLogging = new Thread(new ThreadStart(hsmHygroMonitoring.Start));
            //tCleoHygroLogging.Start();
        }

        protected override void OnStop()
        {
            //ServerConfig.NetworkThreadState = TypeDef.ThreadState.STOPPED;
            //tnsNetworking.Stop();
            //ServerConfig.HygroMeterThreadState = TypeDef.ThreadState.STOPPED;
            //hsmHygroMonitoring.Stop();

            //tCleoNetworking.Abort();
            //tCleoHygroLogging.Abort();
        }

Thema: In WndProc gezeichnetes wird sofort übermalt
Am im Forum: Grafik und Sound

Und das zweite Bild

Thema: In WndProc gezeichnetes wird sofort übermalt
Am im Forum: Grafik und Sound

Hoi

anbei die zwei Screenies. Aussehen soll es so wie auf dem Screeni "mit Fokus". Bei dem zweiten Screenie hab ich die oberen Punkte des Strings (SmartLabel) markiert. Damit du siehst, dass es gezeichnet wird, aber der TextBox Part der ComboBox aus irgendeinem Grund drüber gemalt wird.

Hier noch mein Code. Ist nur der, der Hauptklasse, das Model und die BusinessLogic machen nix besonderes. Nur Properties und eine MeassureString Methode sind da drin. Haben aber nix mit dem Zeichnen zu tun.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using System.ComponentModel;

namespace IComboBox2k10
{
    [ToolboxBitmap(@"A:\_Development\Visual Studio 2008\Projects\_WinFormControls\ComboBoxOffice2k10\ComboBoxOffice2k10\ComboBox.png")]
    public partial class IComboBox2k10 : ComboBox
    {
        public IComboBox2k10()
        {
            SmartLabelFont = base.Font;
            SmartLabelForeColor = Color.Gray;
            SmartLabelPadding = new Padding(3, 0, 0, 0);

            Office2k10Design = true;

            this.FlatStyle = FlatStyle.Flat;
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            //SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        }

        // ***************************************** Windows API *****************************************
        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);

            if (m.Msg == WM_PAINT || m.Msg == WM_ERASEBKGND || m.Msg == WM_NCPAINT ||

                           m.Msg == WM_NCPAINT ||
                           m.Msg == WM_ERASEBKGND ||
                           m.Msg == WM_PAINT ||
                           m.Msg == WM_MOVE ||
                           m.Msg == WM_WINDOWPOSCHANGING ||
                           m.Msg == WM_SIZE ||
                           m.Msg == WM_SETFONT ||
                           m.Msg == WM_MOUSEMOVE ||
                           m.Msg == WM_MOUSELEAVE ||
                           m.Msg == WM_SETFOCUS)
            {
                //IntPtr hdc = GetDCEx(m.HWnd, (IntPtr)1, 1);
                IntPtr hdc = GetWindowDC(m.HWnd);

                if (hdc != IntPtr.Zero)
                {
                    Graphics gGraphics = Graphics.FromHdc(hdc);
                    // Paint
                    Rectangle rectClientRectangle = new Rectangle(0, 0, this.Width, this.Height);
                    ControlPaint.DrawBorder(gGraphics, rectClientRectangle, BorderColor, ButtonBorderStyle.Solid);
                    SizeF szfSmartLabelSize = MeasureStringSize(SmartLabelText, SmartLabelFont);

                    // Paint Border
                    gGraphics.DrawRectangle(new System.Drawing.Pen(BorderColor), 0, 0, Width - 1, Height - 1);

                    // Paint Label
                    if (ShowSmartLabel && blDisplaySmartLabel)
                    {
                        gGraphics.DrawString(SmartLabelText, SmartLabelFont, new SolidBrush(SmartLabelForeColor), (float)SmartLabelPadding.Left,
                            0);//(this.Height - szfSmartLabelSize.Height) / 2);
                    }

                    m.Result = (IntPtr)1;
                    ReleaseDC(m.HWnd, hdc);
                }
            }
        }
        // ***********************************************************************************************

        protected override void OnTextChanged(EventArgs e)
        {
            blDisplaySmartLabel = (this.Text.Length > 0) ? false : true;

            base.OnTextChanged(e);
        }
    }
}

Thema: In WndProc gezeichnetes wird sofort übermalt
Am im Forum: Grafik und Sound

Hab jetzt mal ein bisschen rumgespielt und herausgefunden woran es liegt, aber ich weiß leider keine Lösung.
Der String wird tatsächlich korrekt gezeichnet. Obwohl man ihn nicht sieht. Das Problem ist, dass die ComboBox ja noch mal eine untergeordnete Clientarea hat, welche das eigentliche Textfeld repräsentiert. Und die wird leider über mein String drüber gezeichnet.
Wisst ihr wie ich das abfangen kann? Oder wie ich diesen Teil selbst zeichnen kann?
Das selbe Problem tritt übrigens auf, wenn man von ComboBox ableitet und die Paint Methode überschreibt und UserPaint auf true setzt. dann zeichnet er den TextBox Bereich immer schwarz. Wenn jemand dafür eine Lösung kennt, dann kann ich es ja auch mit dem Überschreiben des Paint Events machen.

Grüße

Ben

Thema: Radialen Text zeichnen?
Am im Forum: Grafik und Sound

Hi McBubbel,

bin mir jetzt nicht sicher, aber hast du es mal als Bild versucht? Also den Text auf ein Image zeichnen und dann das Image krümmen. Das müsste eigentlich funktionieren.

Grüße

Thema: In WndProc gezeichnetes wird sofort übermalt
Am im Forum: Grafik und Sound

Hi,

jetzt ist doch noch ein Problem aufgetaucht, dem ich nicht ganz Herr werde.

Das SmartLabel wird zwar wunderbar gezeichnet, aber sobald sich der Wert der Text Property der ComboBox von gefüllt auf leer ändert wird das SmartLabel nicht mehr angezeigt oder ich die Property ShowSmartLabel von true auf false setze, dann bleibt das SmartLabel stehen, obwohl es nicht mehr gezeichnet werden sollte.

Hier mal mein Code:


protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);

            if (m.Msg == WM_PAINT || m.Msg == WM_ERASEBKGND || m.Msg == WM_NCPAINT)
            {
                IntPtr hdc = GetWindowDC(m.HWnd);

                if (hdc != IntPtr.Zero)
                {
                    Graphics gGraphics = Graphics.FromHdc(hdc);
                    // Paint
                    Rectangle rectClientRectangle = new Rectangle(0, 0, this.Width, this.Height);
                    ControlPaint.DrawBorder(gGraphics, rectClientRectangle, BorderColor, ButtonBorderStyle.Solid);
                    SizeF szfSmartLabelSize = MeasureStringSize(SmartLabelText, SmartLabelFont);

                    // Paint Border
                    gGraphics.DrawRectangle(new System.Drawing.Pen(BorderColor), 0, 0, Width - 1, Height - 1);

                    // Paint Label
                    if (ShowSmartLabel && blDisplaySmartLabel)
                    {
                        gGraphics.DrawString(SmartLabelText, SmartLabelFont, new SolidBrush(SmartLabelForeColor), (float)SmartLabelPadding.Left,
                            (this.Height - szfSmartLabelSize.Height) / 2);
                    }

                    m.Result = (IntPtr)1;
                    ReleaseDC(m.HWnd, hdc);
                }
            }
        }

        protected override void OnTextChanged(EventArgs e)
        {
            blDisplaySmartLabel = (this.Text.Length > 0) ? false : true;

            base.OnTextChanged(e);
            Invalidate();
            Message m = new Message();
            m.Msg = WM_PAINT;
            m.HWnd = this.Handle;
            WndProc(ref m);
        }


Edit:
Ich konnte das Problem jetzt dahingehend eingrenzen, dass das SmartLabel, also der DrawString nie gezeichnet wird, sobald das Control den Fokus verliert. Erhält das Control den Fokus dann wieder, wird es aber trotzdem nicht gezeichnet. Er zeichnet es also immer nur dann, wenn ich ein Propty im Control verändere, sobald der Fokus dann das Control verlässt wird der String nicht mehr gezeichnet, oder überzeichnet. Ich habe jetzt auch andere Windows Messages noch mit abgefangen, was aber am Resultat nichts ändert. Folgende Messages fange ich noch ab:


        private static int WM_NCPAINT = 0x0085,             // int = 133
                           WM_ERASEBKGND = 0x0014,          // int = 20
                           WM_PAINT = 0x000F,               // int = 15
                           WM_MOVE = 0x0003,                // int = 3
                           WM_WINDOWPOSCHANGING = 0x0046,   // int = 70
                           WM_SIZE = 0x0005,                // int = 5
                           WM_SETFONT = 0x0030,             // int = 30
                           WM_MOUSEMOVE = 0x0200,           // int = 512
                           WM_MOUSELEAVE = 0x02A3,          // int = 675
                           WM_SETFOCUS = 0x0007,            // int = 7
                           WM_KILLFOCUS = 0x0008;           // int = 8

Thema: In WndProc gezeichnetes wird sofort übermalt
Am im Forum: Grafik und Sound

Hi herbivore,

OnPaint habe ich zuerst verwendet, da aber das Problem, dass er mir im TextBox Teil der ComboBox immer ein schwarzen Hintergrund gezeichnet hat.
Ich muss ja, wenn ich OnPaint überschreibe UserPaint auf true setzen, dann kommt aber eben der Fehler. Das scheint wohl etwas mit der Clientarea der ComboBox zu tun zu haben, ich habe aber nicht rausbekommen, wie ich diesen Bereich errechnen kann um ihn selbst zu zeichnen.

Habe das mit dem Else probiert. Jetzt hab ich folgenden Fehler: Damit das SmartLabel gezeichnet wird, habe ich ja eine Property


public bool ShowSmartLabel
{
get{return blShowSmartLabel;}
set{blShowSmartLabel = true; Invalidate(true);}
}

sowie eine Color Property,


public Color SmarLabelForeColor
{
get{return clSmartLabelForeColor;}
set{clSmartLabelForeColor = value; Invalidate();}
}
welche die Farbe des SmartLabel bestimmt. Der Witz ist der, dass wenn ich die Eigenschaft ShowSmartLabel der Komponente ändere wird das SmartLabel nicht gezeichnet, obwohl Invalidate() aufgerufen wird. Ändere ich aber die ColorEigenschaft, dann zeichnet er sie plötzlich. Muss ich da eine spezielle Windows Message schicken?

Grüße


Edit: Hab den Fehler gefunden. Danke herbivore, hast mich auf die Idee gebracht. das True beim Invalidate war ein Problem.

Grüße

Thema: In WndProc gezeichnetes wird sofort übermalt
Am im Forum: Grafik und Sound

Hi,

ich habe eine ComboBox geschrieben, welche von Windows.Forms.ComboBox erbt. Eigentlich ist es eine orginale ComboBox mit ein paar zusätzlichen Coloreigenschaften.
Damit das Zeichnen richtig funktioniert habe ich die WndProc Funktion überschrieben. Das funzt auch alles soweit. Das Problem ist, das der String den ich Zeichen lasse (SmartLabel) kurz aufflackert, dann aber sofort wieder verschwindet. Also überzeichnet wird, durch irgendetwas.
Reagiere ich auf zuwenige Windows Messages? Woran kann das sonst noch liegen? Hoffe ihr habt eine Idee.
Hier meine WndProc:


protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);

            if (m.Msg == WM_PAINT || m.Msg == WM_ERASEBKGND || m.Msg == WM_NCPAINT)
            {
                //IntPtr hdc = GetDCEx(m.HWnd, (IntPtr)1, 1 | 0x0020);
                IntPtr hdc = GetWindowDC(m.HWnd);

                if (hdc != IntPtr.Zero)
                {
                    Graphics gGraphics = Graphics.FromHdc(hdc);
                    // Paint
                    Rectangle rectClientRectangle = new Rectangle(0, 0, this.Width, this.Height);
                    ControlPaint.DrawBorder(gGraphics, rectClientRectangle, BorderColor, ButtonBorderStyle.Solid);

                    // Paint Text
                    gGraphics.DrawString(Text, Font, new SolidBrush(ForeColor),
                                          new PointF(0, (this.Height - MeasureStringSize(this.Text, this.Font).Height) / 2));

                    // Paint Border
                    gGraphics.DrawRectangle(new System.Drawing.Pen(BorderColor), 0, 0, Width - 1, Height - 1);

                    // Paint Label
                    if (ShowSmartLabel && blDisplaySmartLabel)
                    {
                        gGraphics.DrawString(SmartLabelText, SmartLabelFont, new SolidBrush(SmartLabelForeColor), (float)SmartLabelPadding.Left,
                            (this.Height - MeasureStringSize(SmartLabelText, SmartLabelFont).Height) / 2);
                    }

                    m.Result = (IntPtr)1;
                    ReleaseDC(m.HWnd, hdc);
                }
            }
        }

Thema: Crystal Report PrintOptions
Am im Forum: Rund um die Programmierung

Hi zusammen,

ich habe in meinem Formular einen Crystal Report Viewer, der mir einen Crystal Report anzeigt den ich vorher mit einem DataSet fülle. Das funzt auch super.
Jetzt will ich das Teil ausdrucken. Der eingebaute PrintButton im CrystalViewer ist aber nicht zu gebrauchen. Da ich ja mit der Funktion


PrintToPrinter
den Report auch selbst drucken kann hab ich also einen eigenen Drucken Button gemacht der in das Design der Anwendung passt. Dieser Button ruft einen


System.Windows.Forms.PrintDialog 
auf. Das Problem ist, dass sämtliche enums die der


System.Windows.Forms.PrintDialog
hat nicht mit denen von Crystal übereinstimmen.

Ich setze zum Drucken die Optionen


sdrDataReport.PrintOptions.CustomPaperSource = e.CustomPaperSource;
sdrDataReport.PrintOptions.PaperOrientation = e.PaperOrientation;
sdrDataReport.PrintOptions.PaperSize = e.PaperSize;
sdrDataReport.PrintOptions.PaperSource = e.PaperSource;
sdrDataReport.PrintOptions.PrinterDuplex = e.PrinterDuplex;
sdrDataReport.PrintOptions.PrinterName = e.PrinterName;
was ja imho auch Sinn macht. Aber PaperSize z.B. lässt sich mit einem simplen


Enum.Parse
leider nicht konvertieren, da es bei Windows.Forms.PrintDialog heißt:


PaperSize.A4;
und bei Crystal:


PaperSize.PaperA4;
Gibts da irgendeine Möglichkeit außer alles von Hand zu konvertieren? Z.B. das ich den Crystal PrintDialog aufrufe von meinem Button aus anstatt den Windows.Forms.PrintDialog?

Hoffe ihr könnt mir helfen.

LG

Ben

Thema: Netzwerk Thread in Windows service - CPU Auslastung
Am im Forum: Netzwerktechnologien

Hey ihr zwei, danke für eure Tipps.

kleines_eichhoernchen, das ist eine gute Idee. Mit den Callbacks hab ich beim Threading.Timer schon gearbeitet, den ich an anderer Stelle einsetze.

Den Ansatz werde ich weiterverfolgen. Dank dir.

Grüße

Ben

Thema: Netzwerk Thread in Windows service - CPU Auslastung
Am im Forum: Netzwerktechnologien

Hi zusammen,

ich habe einen Windows Service geschrieben, der als Server für meine Client Applikation fungieren soll und einige Funktionen via Netzwerk zur Verfügung stellt.
Dazu starte ich beim starten des Dienstes einen neuen thread in dem der Netzwerkmanager läuft. dieser wartet in einer


while(true)
{
}

Schleife auf neue Verbindung. Kommt eine neue Verbindungsanfrage rein wird diese in einem neuen Thread gestartet und dort bearbeitet.
Mein Problem ist, dass ich bei dieser Technik immer caö 50% CPU Auslastung habe. Sobald ich den Netzwerkpart deaktiviere geht die CPU Auslastung des Dienstes auf 0 % runter. Die anderen Services die der Dienst bereitstellt ziehen also kaum CPU Last.

Ich finde die while(true) Geschichte eh nich sonderlich prickelnd habe aber leider keine andere Lösung gefunden. Ist das überhaupt das Problem? Gibts hierfür etwas eleganteres? Wie macht ihr das mit dem warten auf Netzwerkanfragen?

Grüße

Ben

Thema: Dienst per MSI starten
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hi,

also ich habe einen Dienst geschrieben und dazu ein Setup Projekt der das Teil installiert. Wunderbar klappt auch alles, aber wie bekomm ich den Dienst gestartet? Ich wil ein Reboot vermeiden.
Ich vermute mal dass es über das PostBuild Event im Setup Projekt funzt, aber wie ich das verstanden habe führt das event nur batches aus via call C:\mybat.bat
Ich will aber eigentlich keine batch mitliefern. Geht das nicht noch anders? zu dem PostBuildEvent steht im MSDN leider nicht wirklich tolles.

Lg

Ben

Thema: Timer für einem Windows Service
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi zero_x

logisch. Argh. Danke für den Schups von der Leitung. Der Beispiel code ist nicht wirklich echt. Im echten Code wird keine MessageBox angezeigt, sondern eine XML Datei per URL importiert.
Aber ist ja klar, dass das nicht laufen kann. Da der Timer in einem Windows Service laufen soll ist es denke ich mal eh besser den Thread timer zu verwenden. Hab den zwar noch nie benutzt aber das MSDN Beispiel ist nicht wirklich schwierig.

LG

Ben

Thema: Timer für einem Windows Service
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi Chris,

danke für den Hinweis. Bin grad dabei mich im MSDN über Thread Timer schlau zu machen.
Kannst du mir verraten, warum beim Zuweisen des Tick Events ich new EvenHandler nutzen muss? Bisher habe ich die Events immer so zugewiesen:


mycontrol.Event += Method1;

und nicht mit:


mycontrol.Event += new EventHandler(Method1);

Grüße

Thema: Timer für einem Windows Service
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi, ich hoffe ihr könnt mir helfen.
Mein Problem: Ich starte einen Thread, der wiederum einen Windows.Forms.Timer erstellt, dessen Tick Event eine Methode zuweist und den Timer startet.

Hier der Code:



        private System.Windows.Forms.Timer tTmp;
        private Thread thTmp;
        private void button1_Click(object sender, EventArgs e)
        {
            thTmp = new Thread(new ThreadStart(tmpThreadStart));
            thTmp.Start();
        }

        private void tmpThreadStart()
        {
            tTmp = new System.Windows.Forms.Timer();
            tTmp.Interval = 1000;
            tTmp.Tick += ttmp_tick;
            tTmp.Start();
        }

        private void ttmp_tick(object sender, EventArgs e)
        {
            MessageBox.Show("blubb");
        }

Ist nur heißer Beispielcode aber so macht es auch mein Service in dem der Code steckt.
Das Problem ist: die Methode: ttmp_tick wird niemals aufgerufen.

Ich vermute mal, dass es daran liegt, dass der Timer einen eigenen Thread aufmacht oder liege ich da falsch? Nur wie kann ich das beheben?

Grüße und schöne Ostern.

Ben

Thema: Objekte verschiedener Typen auslesen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi t2t,

danke für die schnelle Antwort. Genau das wollte ich eigentlich vermeiden. Ich dachte es gibt eine Möglichkeit anhand eines Dictionaries z.b. wo zu jedem enum, den ich habe der Modul Typ drin steht, ich auch casten kann.
Also z.B.:


Dictionary<Modules, String> mydic;

((mydic[Modules.MOD1])ctrl).spezielles_property;


Aber das funzt ja nicht.

Thema: Objekte verschiedener Typen auslesen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi,

ich habe folgendes Problem:
Ich habe ein Panel, welches verschiedene Controls (Module) enthält. Diese heißen z.B.:
_ucMyControl
_ucNochEinControl

Diese Controls sind abgeleitet von UserControl. Ich erstelle die Controls zur Laufzeit (sind quasi die Module meiner Hauptanwendung, so als eine art MDI).
Außerdem habe ich einen enum Typ in meiner Hauptanwendung die mir die Module auflistet.
Soweit wunderbar, aber jetzt muss ich ein Panel (mein Hauptpanel, welches alle geöffneten Module beinhaltet) durchgehen und auf eine Property meiner geöffneten Module zugreifen. Welches Modul geöffnet ist habe ich in einer generischen List gespeichert die mit meinem Modul enum gefüllt ist.

Nur wie bekomme ich anhand meines Enums eine Zuordnung zu dem Modul Controls?
Ich kann zwar mit:


foreach (Control ctrl in ModHost.Controls)
{
}
Alle Controls durchgehen, aber ich muss ja ein irgendwie eine Referenz auf mein _ucMyControl bekommen. Und ich möchte eigentlich nicht eine rießen große Switch oder If Abfrage mit TypeOf machen. Geht das nicht auch irgendwie anders?

Grüße

Thema: Thread, Inoke, UI
Am im Forum: GUI: Windows-Forms

Hi,

ich habe eine kleine Frage:
Ich habe meine UI bei der ich ganz normal im Form Code die Steuerelemente setzen kann.
Dann habe ich eine Klasse BusinessLogic, die im Form Code über:


BusinessLogic ooBLogic = new BusinessLogic();
referenziert ist. Somit kann ich die Klasse nutzen.
Die BusinessLogic hat eine Methode


SendMail()
diese MEthode startet einen neuen Thread, welcher Mails sendet. Soweit funzt alles.
Der Thread, welcher die Mails hat ein selbstgebautes Event, welches nach jeder gesendeten Mail versendet wird. Funzt auch. Die BusinessLogic verbindet sich an dieses Event und schmeißt wiederum ein eigenes Event. An dieses Event ist die UI Klasse connected. Das Event kommt auch direkt im UI Code an.
Der Code der ausgeführt wird setzt die Text Eigenschaft von einem Label. Und hier ist das Problem, der Debugger sagt mir dass hier ein Steuerelement von einem falschen Thread heraus geändert wird. Warum? Die Methode die das Steuerelement ändert liegt doch in der UI Klasse.

Hier mal der Code:
UI:


        public _frmWSMCEMail()
        {
            InitializeComponent();

            ooBLogic.ProgressBarConfig += ProgressBarConfig_Event;
        }

        private void ProgressBar_Event(object sender, SendMailEventArgs e)
        {
            Logging(Environment.NewLine + e.CurrentSendOut.ToString() + ":" + e.EMailAddress);
        }

        private void Logging(string strMsg)
        {
            //_pgbProgress.PerformStep();
            //_lblLogging.Text += strMsg;
        }

BusinessLogic:


private event EventHandler<SendMailEventArgs> _oSending;

        #region Event SendMail
        /// <summary>
        /// Executes the sendmail event
        /// </summary>
        /// <param name="e">An instance of the eventargs class which includes the event handler.</param>
        protected virtual void OnSending(SendMailEventArgs e)
        {
            if (_oSending != null)
                _oSending(this, e);
        }
        /// <summary>
        /// Is executed if sendmail is sending
        /// </summary>
        public event EventHandler<SendMailEventArgs> Sending
        {
            add { _oSending += value; }
            remove { _oSending -= value; }
        }
        #endregion

public void SendMailWrapper(string strBodyHTML, string strBodyText, string strFrom, string strFromDisplayName, 
                                    string strReturnAddress, string strSMTPServerIP, string strSMTPServerPW, string strSMTPServerUser, 
                                    string strSubject, string strTo, string[,] strarrAttachments, string strTableName, 
                                    string strDBEMailField, string[] strarrFields, string strDBSelCondSQL, string strDBUpdCondSQL, 
                                    string strDBUpdFieldsSQL)
        {

                tSendMail = new Thread(new ThreadStart(ooSendMailThread.Start));
                ooSendMailThread.Sending += Sending_Event;
                tSendMail.Start();
}

SendMailThread:


#region Event SendMail
        private event EventHandler<SendMailEventArgs> _oSending;
        /// <summary>
        /// Executes the sendmail event
        /// </summary>
        /// <param name="e">An instance of the eventargs class which includes the event handler.</param>
        protected virtual void OnSending(SendMailEventArgs e)
        {
            if (_oSending != null)
                _oSending(this, e);
        }
        /// <summary>
        /// Is executed if sendmail is sending
        /// </summary>
        public event EventHandler<SendMailEventArgs> Sending
        {
            add { _oSending += value; }
            remove { _oSending -= value; }
        }
        #endregion

        public void Start()
        {
                    ooMail.SendHTMLMail();
                    OnSending(new SendMailEventArgs(ooMail.To, 1));
}

Ich bin mit Invokes soweit eigentlich vertraut. Aber die kann ich hier nach nicht verwenden, das der Invoke ja immer innerhalb einer Form klasse aufgerufen werden muss.

Hoffe ihr könnt mir von der Leitung helfen.

Grüße

Thema: Form als dll: Form aus Access 97 Anwendung heraus öffnen
Am im Forum: GUI: Windows-Forms

Hmm,

hängt meine Fehlermeldung dann damit zusammen? Er kann die dll laden, aber bringt immer den Fehler, dass er den dll Einsprungpunkt der Funktion nicht finden kann.
Oder muss ich den Standardkonstruktor abändern, damit der Fehler nicht kommt?
Müsste es nicht ausreichen, wenn das .net Framework auf dem Rechner drauf ist?

Grüße

Thema: Form als dll: Form aus Access 97 Anwendung heraus öffnen
Am im Forum: GUI: Windows-Forms

Hallo,

habe eine allgemeine Frage. Ich habe eine Form und kompiliere diese als dll.
diese dll kann ich doch aus jeder anderen Programmiersprache, die dll's laden kann ansprechen.
Also konkret: Ich möchte die Form aus einer Access 97 Anwendung heraus öffnen. Access 97 verwendet ja VBA. In VBA kann ich externe dll's verwenden, damit müsste ich doch auch dann meine Form aus meiner dll laden können oder?

Grüße