Hallo an alle,
wir haben ein kleines Projekt entwickelt mit folgenden Anforderungen:
Ein Windows Dienst soll beim Start von Windows, aber schon vor der Benutzeranmeldung laufen. Der Dienst hört auf einem Netzwerkport und wartet entweder auf einen "Shutdown" oder einen "Restart" Befehl. Der Dienst soll auch noch weiterlaufen wenn der Benutzer angemeldet ist.
Hier sieht man wie der Dienst installiert wird:
using System;
using System.ComponentModel;
using System.Configuration.Install;
using System.ServiceProcess;
namespace WakeOnInternetService
{
[RunInstaller(true)]
public class WakeOnInternetServiceInstaller : Installer
{
/// <summary>
/// Public Constructor for WindowsServiceInstaller.
/// - Put all of your Initialization code here.
/// </summary>
public WakeOnInternetServiceInstaller()
{
ServiceProcessInstaller serviceProcessInstaller = new ServiceProcessInstaller();
ServiceInstaller serviceInstaller = new ServiceInstaller();
//# Service Account Information
serviceProcessInstaller.Account = ServiceAccount.LocalSystem;
serviceProcessInstaller.Username = null;
serviceProcessInstaller.Password = null;
//# Service Information
serviceInstaller.DisplayName = "WakeOnInternetClientService";
serviceInstaller.StartType = ServiceStartMode.Automatic;
serviceInstaller.Description = "Waits for wake messages";
// This must be identical to the WindowsService.ServiceBase name
// set in the constructor of WindowsService.cs
serviceInstaller.ServiceName = "WakeOnInternetClientService";
this.Installers.Add(serviceProcessInstaller);
this.Installers.Add(serviceInstaller);
serviceInstaller.AfterInstall += ServiceInstaller_AfterInstall;
}
private void ServiceInstaller_AfterInstall(object sender, InstallEventArgs e)
{
ServiceController sc = new ServiceController("WakeOnInternetClientService");
sc.Start();
}
}
}
In der
OnStart
Methode meines Dienstes starte ich den "ListenThread" für die Netzwerkkommunikation. Folgende Methoden verwende ich um das System herunter zu fahren oder neu zu starten:
private void SystemShutdown()
{
Process.Start("shutdown", "/s /t 0");
}
private void SystemRestart()
{
Process.Start("shutdown", "/r");
}
Nun zu meinen Fragen:
Welche
serviceProcessInstaller.Account
kann ich dazu verwenden und wo sind die Unterschiede?
Kann man die Mathoden
SystemShutdown
und
SystemRestart
ohne Benutzeranmeldung ausführen?
Der Dienst hat beim testen nach Benutzeranmeldung funktioniert und wird auch automatisch gestartet.
Mit freundlichen Grüßen,
VRComputing
Ich konvertiere nun IEnumerable in eine DataTable, damit konnte ich das Problem lösen und ist zudem wohl auch die "saubere" Lösung, um die Daten zu binden.
Hallo zusammen.
Habe momentan ein für mich nicht lösbares Problem.
Und zwar Verusche ich ein WPF Datagrid als Matrix zu verwenden. Ähnlich einem Schachbrett.
Die Zeilen werden durch eine Klasse repräsentiert, die eine ID und einen Namen enthält. Das ist sozusagen meine Zeilenbeschriftung.
Desweiteren habe ich Spalten deren Anzahl nicht fest ist. Diese werden über eine Schleife im Codebehind erzeugt.
Das CellTemplate ist ein Togglebutton dessen Style so angepasst ist damit man nur den IsChecked Status als ausgefülltes Rechteck erkennen kann. Dadurch habe ich die Möglichkeit irgendwelche Abhängigkeiten festzulegen.
Hier mal eine Zeichnung eines algemeinen Beispiels um das etwas besser Verständlich machen zu können:
ID | Name | A | B | C | D | E |
0 | null | | | | | |
1 | eins | | | | | |
2 | zwei | | x | | x | |
3 | drei | | | | | |
4 | vier | | | | x | |
5 | fünf | x | | | | |
6 | sechs | | | | | |
Mein Grid ist noch etwas größer und komlizierter. Ca 90 Spalten und 130 Einträge. Mit zusätlichen Gruppenheaders. Sollte aber hier mal nichts zur Sache tun.
Ich habe nun bereits mehrere Grids von Drittanbietern verwendet. (infragistics, telerik und xceed)
Dementsprechend ist auch bei jedem Control der Code etwas anders.
Doch bei allen musste ich das selbe Feststellen:
Ich setze irgendwo "Häckchen" und scrolle. Dabei werden die Häckchen bzw. in meinem Fall die markierten Rechtecke wie wild verschoben.
Es scheint für mich als wäre hier der Speicher zu klein. Bzw. ich kann mir das nicht genau erklären was hier falsch läuft.
Hätte mir vieleicht irgendjemand einen Tipp was zu diesem Phänomen führt. Und wie ich es in den Griff bekomme dass die Markierungen dort bleiben wo ich sie gemacht habe.
Für die Zukunft:
Bitte markiere interessante Stellen im Code, z.B. per Kommentar. Die Zeile
int RecByte = socket.Receive(buffE);
kommt mehrmals vor. Und die Stelle in Deiner Form ist überhaupt nicht auffindbar.
Für jetzt:
Hier http://msdn.microsoft.com/en-us/library/8s4y8aff.aspx steht, dass das Blockieren bei Receive(byte[]) normales Verhalten ist. Die Anweisung kehrt erst zurück, wenn der Puffer voll ist.
Teste das, indem Du dem Socket Daten zum Lesen zur Verfügung stellst. Blockiert er immernoch, nachdem Daten in der Größe des Puffers empfangen worden sind?
Du müsstest im ersten Schritt einmal den Unterschied zwischen "C#" und "C" verstehen, du bist im falschen Unterforum (Zudem stellt sich die Frage warum deine Code-Tags Probleme bereiten - vielleicht solltest du ihnen jeweils eine eigene Zeile spendieren).
Ein Admin wird dich sicherlich verschieben.
Klingt für mich nach: Richtiger Gedanke, falsche Weg. Dadurch das Du autogenerierten Code von Hand schreibst entsteht kein tieferes Verständnis, es kostet lediglich unnötig viel Zeit die Du besser darin investieren würdest Dich mit tatsächlich interessantem Wissen auseinanderzusetzen. Du willst tiefer gehendes Verständnis? Dann arbeite lieber so ein Buch wie http://www.amazon.de/CLR-via-C-Developer-Reference/dp/0735667454/ref=dp_ob_title_bk durch...
Es gibt einen Grund warum gewisse Teile des Codes autogeneriert werden: Weil er banal und langweilig ist...
Gerade eine IDE wie Visual Studio hilft das Du dich auf das Wesentliche konzentrieren kannst weil die Umgebung Dir das banale abnimmt...
Warum verwendest du dann überhaupt ein GUI-Control (DataGridView), wenn du die Daten nur intern bearbeitest?
Ansonsten müßtest du mal einen Memory-Profiler verwenden, um herauszufinden, warum der GC die Altdaten nicht löscht (evtl. sind noch Referenzen darauf irgendwo gehalten).
Hallo!
Also ich habe einen Feldversuch gestartet und kam zu folgenden Ergebnis:
WPF (XAML) ist vorzuziehen, MS hat die Weiterentwicklung von WinForms zu Gunsten XAML bereits eingestellt.
Also ich habe einen komplizierten Layout-Container aus Grid, Dock-Panel, Stack-Panel, Panel-Splitter, Grid-Splitter und einem Frame im Hauptfenster mit XAML erstellt und quer über das Fenster mal eine Canvas mit einer Linie gezogen. Grafisch scheint hier Keiner Keinen zu stören. Auch der VS 2012-Generator für Xaml stört sich nicht an Formentwicklungen.
WindowsFormsHost-Klasse implementiert und im Grid einfach ein Formelelement zu setzen funzt easy. Auch ein triviales using mit der Form-Klasse im Code stört WPF nicht.
Edit: Mit Ausnahme sich gelegentlich überlagenden Namensräumen.
Mein altes Form-Layout habe ich mit einer trivialen Page in einem Frame gesetzt und funzt ebenfalls prima. Ja, der Datenaustausch muss neu gecodet werden, weil der Sichtbarkeitbereich durch das Frame beschnitten wird.
XAML ist viel prozessdualer als Form-Code (OO). Deshalb muss man mehr die Reihenfolge beachten. Auch kann man die Container-Layout Elemente nicht wahlfrei ineinander stecken. Muss man ein wenig fummeln.
Apropros Fummeln - Ein banales Problem bekomme ich im Moment nicht gelöst:
Ich habe in einer Zelle eines Grids das Frame eingebedded. Aber wenn ich die Zelle mit der Mouse verkleinere, überlagert es immer den Frame. Eine Koppelung mit dem Grid<->Frame<->Page gelingt mir irgendwie nicht.
Hat einer Ideen dazu?
Edit: Hat sich erledigt. Aus unerklärlichen Gründen wird bei einer RichTextbox Width="auto" nicht ausgeführt, Height="auto" aber schon - It's not a bug, it's a feature.
http://connect.microsoft.com/VisualStudio/feedback/details/354442/wpf-richtextbox-wrapping-fails-in-listboxA - Loser. :p
Saxo schrieb:
Jo, gute Frage. Ich meine keine Hobby-Anwendungen (weil damit sein Geld verdienen können ist wichtig) und hoher Logik-Anteil...
Also eher keine Geschäftsanwendungen (ja, auch da kann es einen hohen Logikanteil geben, aber nach meiner Erfahrung ist dieser verhältnismäßig gering* und nicht selten ist tatsächlich der Datenbankanteil hoch).
* heißt aber nicht, das Geschäftsanwendung wirklich nur dummes einlesen und zurückschreiben bedeuten, sondern nur das aus meiner Sicht andere Bereiche häufiger einen höheren Logikanteil haben.
Saxo schrieb:
..., also nicht einfach Daten einlesen, Benutzer verändert diese, und wieder in die DB abspeichern...
Ich glaube gerade in den Bereichen die viel Logik enthalten (Wissenschaftliche Anwendungen, Spiele usw.) sind andere Sprachen mit größeren Anteil verbreitet.
Saxo schrieb:
...Kann es sein, dass C# eher für lokale Anwendungen aka Fat Clients verwendet wird und weniger für Web-Server (weil hier Tomcat & Co. regieren)?...
Ich würde sagen das C# (zumindest nach meiner Erfahrung) sehr stark im Bereich Geschäftsanwendungen vertreten ist. Dies heißt aber nicht Zwangsweise Fat Client, ASP.NET ist durchaus auch vorhanden und wird genutzt. Sofern man mehrere Welten bedienen will, wird der "Fat Client" schnell etwas schlanker, und die Logik mehr zum Server hin verlagert...
Hmpf. Doof.
Vielleicht geht's mit DeviceInformation.FindAllAsync
----
Brauchst du denn eine App Store kompatible Lösung?
Die WMI Sache sollte sonst nämlich zuverlässig funktionieren.
Die sieben Karten sollten vor der Betrachtung in ein Array rein kopiert und sortiert werden.
Ich nehme hustbaers Ansatz.
for(Rank r=R2;Rank<=Ace;++r){
int anzahlGleiche=0;
for(int i=0;i<7;++i)
if(karte[i].Rank==r)
++anzahlGleiche;
if(anzahlGleiche==2)
MessageBox.Show("Pärchen von"+r);
else if(anzahlGleiche==3)
MessageBox.Show("Drilling von"+r);
else if(anzahlGleiche==4)
MessageBox.Show("Vierling von"+r);
}
for(Suit s=Hearts;s<=Spades;++s){
int anzahlGleiche=0;
for(int i=0;i<7;++i)
if(karte[i].Suit==s)
++anzahlGleiche;
if(anzahlGleiche>=5)
MessageBox.Show("Flush in "+s);
}
for(Suit s=Hearts;s<=Spades;++s){
int straßenlaenge=0;
for(int i=6;i>=1;++i)
if(karte[i-1].Rank==karte[i].Rank){
++straßenlaenge;
if(straßenlaenge==5)
MessageBox.Show("Straße in endend mit "+karte[i+4]);
}
}
Aber das ist ja erst der Anfang. Dann mußte noch die Kombinationen wie Zwillung UND Drilling packen, fürchte ich.
Hi hustbaer
Danke für die schnelle Antwort das war die Lösung
Ich musste VS2012 erst aktualisieren danach war dann das XP Toolchain verfügbar.
Ist ja verrückt auf was man mittlerweile alles achten muss
Du hast aber schon verstanden was µ geschrieben hat, oder?
Du musst deine beiden DateTimePicker mit DateTime.Now.Date initialisieren, und nicht mit DateTime.Now .
Hi x-men,
nunja, dass ist eigentlich total einfach
Aber ich weiß nun nicht wo Du Kenntnismäßig bei WPF stehst.
Hast Du schon mal eigene Control-Templates definiert?
Das Basis-Template für die Checkbox findest Du hier:
http://msdn.microsoft.com/de-de/library/vstudio/ms752319.aspx
Auf Basis dieses Templates kannst Du problemlos aufbauen.
Verweise in Deiner app.xaml mittels ResourceDictionary auf ein eigenes Template. Dieses setzt Du mittels Style TargetType auf {x:Type CheckBox} und dann schaut jede Checkbox in Deiner Application gemäß Deiner Vorgaben aus. Wenn nur manche Checkboxen Deinen speziellen Look erhalten sollen setze zudem die x:Key Property, dann kannst Du jeder Checkbox diesen Style zuweisen, wenn Du willst.
Und um den Haken gegen einen Border konkret zu tauschen: Schmeiß den Glyph-Krempel raus und zeichne einfach einen Border mit Deiner gewünschten Farbe
Falls Du da Detailfragen hast, gib laut, ich helfe Dir da gerne
Viele Grüße
Mnenomic