Hallo ErfinderDesRades,
ja, die "Serialisierung", Erstellung und "Deserialisierung" wird in einem Nebenthread gemacht, die Erstellung selbst in einer externen Applikation. Schön ist wieder was anderes aber somit bekomme ich wenigstens das lästige ruckeln weg.
Wie gesagt, sämtliche Ansätze (Threads und deren Prioritäten, AppDomains oder eine zweite MessageLoop (was ich mir von dem versprach weiss ich nicht mehr)) verliefen bei mir im Sande, das ruckeln blieb. Alles was irgendwie im Kontext meiner Anwendung lief half nicht.
Grüsse, harrylask
Hallo ErfinderDesRades,
aber wennich den code jetzt angucke, wunder ich mich, dass du 2 Graphics-objekte brauchst. mit g1 löschst du die Source, mit g2 kopierst du die (gelöschte) Source nach Destination.
Das Beispiel dient nur zum Zweck, es ist kein Originalcode. Ohne Graphics.DrawImage() ist bei mir kein Ruckeln feststellbar, mit schon.
ipcChannel, das heißt, hinter der property "Source" steckt ein Proxy, der erstmal über den Channel die bitmap anfordern muß?
nee, ist quatsch.
Jepp, wie würde dein Ansatz aussehen?
Grüsse, harrylask
Meine Lösung ist die das mir eine externe Anwendung mit der ich über einen IpcChannel kommuniziere das Bitmap erstellt, sämtliche Versuche die im Kontext meiner Anwendung liefen brachten den GUI Thread ins stocken.
Grüsse, harrylask
So, vorerst danke für die Hinweise.
@talla herbivore
Die Anwendung ist für einen Leitstand einer Anlage auf deren Oberfläche die Anlage selbst animiert dargestellt wird. Die Teile der Anlage liegen als Bitmaps als Resource in der Anwendung vor. In bestimmten Intervallen wird asynchron eine Methode aufgerufen die das Bitmap erstellt und je nach Auflösung skaliert.
@Allgemein
Wenn ich so wie ErfinderDesRades vorschlägt einen DauerbetriebNebenThread laufen lasse ohne der Anweisung Graphics.DrawImage() reagiert meine Hauptanwendung wie gewünscht. Füge ich aber Graphics.Draw() ein reagiert die Anwendung träge wenn sie mE irgendwas mit GDI zu tun bekommt.
aber dann würden auch alle anderen anwendungen diesen hänger haben
Nö, ist nicht der Fall. Alle anderen funktionieren normal.
Mein Verdacht ist das es irgendwie mit der GDI zu tun hat, hab aber keine Ahnung warum, mir fällt dazu auch keine Lösung ein wie ich das abstellen könnte. Könnt ihr das Verhalten eigentlich reproduzieren?
So long, harrylask
Der Link hilft mir nicht weiter, ich lagere ja die Erstellung des Bitmaps in einen extra Thread aus damit mir der GUI Thread während dessen nicht blockiert wird. Er wird aber trotzdem kurz blockiert (beim Resizen, bewegen eines anderen Fensters auf der Oberfläche des GUIs). Die Ursache ist Graphics.DrawImage() die eigentlich eh im Nebenthread ausgeführt wird, warum stockt mir dann die Hauptanwendung?
Hallo Leute,
ich erstelle in einer asynchronen Methode die zyklisch aufgerufen wird ein Bitmap welches ich am Ende je nach Fenstergrösse skaliere, funktioniert prinzipiell einwandfrei. Der Haken ist das mir die Anweisung Graphics.DrawImage() für einen Bruchteil den GUI Thread blockiert.
private void timer1_Tick(object sender, EventArgs e)
{
new MethodInvoker(this.Test).BeginInvoke(null, null);
}
private void Test()
{
Bitmap Source = new Bitmap(4380, 1650);
Bitmap Destination = new Bitmap((int)(Source.Width * 0.26F), (int)(Source.Height * 0.26F));
using (Graphics g1 = Graphics.FromImage(Source))
{
g1.Clear(Color.White);
using (Graphics g2 = Graphics.FromImage(Destination))
{
g2.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g2.DrawImage(Source, 0, 0, Destination.Width, Destination.Height);
}
}
}
Wenn ich die g.DrawImage() Anweisung weglasse gehts, hat jemand eine Idee warum das so ist bzw. wie ich das umgehen kann?
Danke, harrylask
Hallo Neokil,
ALT-F4 kannst du im FormClosing Event abfangen (FormClosingEventArgs.Cancel auf true setzen).
Grüsse, harrylask
Hallo Staregatefreak,
vielleicht meinst du diesen Bug im ?Framework? (http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=98281)?
Grüsse, harrylask
Hallo ChrDressler,
string inputString = (value ?? string.Empty).ToString();
ist äquivalent zu
string inputString = (value != null ? value : string.Empty).ToString();
Grüsse, harrylask
Hallo JuyJuka,
mir fällt es auch immer schwer zu posten, ich feile an meinen Beiträgen immer minutenlang herum bis sie mir gefallen, darum auch meine geringe Anzahl an Beiträgen.
Aber ebenso lese ich (meistens) die Beiträge immer genau durch und dabei ist mir dein "sollte" aufgefallen. Sowas irritiert mich und ich frage mich dann immer warum ich dies oder jenes nicht tun sollte. Hört sich zwar kleinkariert an aber mich hat der Beruf geprägt, muss immer alles hinterfragen ... fast schon krankhaft 👅
Grüsse und nix für ungut, harrylask
Original von JuyJuka
Original von nin
if (sender is ListView) ListView lst = sender as ListView;
Ahhh! Hilfe!! Der :::
Die beiden sollen (sollten) nie zusammen verwendet werden. So gehts "richtig":
if (sender is ListView) ((ListView)sender).DoWhatEver();
ODER
ListView lst = sender as ListView; // hier wird keine Exception ausgelöst, sondern NULL zurück gegeben, wenn sender kein ListView ist. if(lst!=null) doWhatEver();
Hallo JuyJuka,
ich seh da keinen grossartigen Unterschied zwischen deinem und nin´s Beispiel, nin prüft ja vorher mit dem is Operator ob es sich um ein ListView Objekt handelt. Ob man nachher castet oder den as Operator verwendet ist egal (abgesehen von der Performance da ja eine Prüfung des Typs durchgeführt wird).
PS: Nichtsdestotrotz würde ich nach der Prüfung mit is auch manuell casten.
PPS: Mir hat der Satz "Die beiden sollen (sollten) nie zusammen verwendet werden" nicht gefallen, besser wäre gewesen "müssen nicht" oder soähnlich.
Grüsse, harrylask
supergreg war wochenlang unser hero!
Hallo Piper,
etwas eleganter ginge es mit den Methoden aus der Char Klasse.
if (!Char.IsDigit(e.KeyChar))
if (!Char.IsControl(e.KeyChar))
e.Handled = true;
Grüsse, harrylask
Reine Vermutung, bei einer Form gibts die Methode CreateHandle(), vielleicht hilft dir die weiter.
Grüsse, harrylask
ist ja ziemlich still geworden um myCSHARP.de 3, gibts neue Infos?
GUI ohne Designer, schlichtweg undenkbar.
Hallo el_MKay,
siehe Application.StartupPath.
Du hast recht, sie werden gespeichert, das Bookmarkwindow war mir neu. Gefallen find ich daran aber trotzdem nicht, obwohl es dem was ich wollte recht nahe kommt, man kanns halt niemanden recht machen.
grüsse, harry
Bookmarks, ich weiss nicht, gehe zum nächsten Boomark, gehe zum vorherigen Bookmark, zu umständlich, werden die überhaupt gespeichert? Die anderen Möglichkeiten die du beschreibst kenne ich, praktisch, aber nicht im meinen Sinne.
Was ich möchte wäre in etwa sowas (Codeausschnitt)
// DROP TABLE -> [URL]http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_de-dz_7uud.asp[/URL]
using (SqlCommand SqlCom = new SqlCommand("DROP TABLE " + Table, Con))
SqlCom.ExecuteNonQuery();
ist, find ich, ganz praktisch, STRG Taste+Mausklick und die Seite wird geöffnet. Nun möchte ich das dieser Link auf eine bestimmte Stelle in meine Source zeigt damit ich schnell und einfach dorthin navigieren kann.
danke und grüsse, harry
Besteht in VS2005 die Möglichkeit zB. via Hyperlink von einer Codestelle zu einer anderen zu verweisen? Dann müsste ich mich nicht immer durch den Source "quälen" bis ich eine bestimmte Verwendungsstelle finde.
Für alle die beim Suchen auf diesen Thread stossen. Hier findet man einen CRC Tester, Code zum Erstellen von CRC´s und weiterführende Links die sich mit diesem Thema befassen.
harrylask
hm, im Selected Event prüfen ob die Node editiert werden kann und dementsprechend TreeView.LabelEdit auf true/false setzen.
@talla:
jaja, Wertetyp, hab ich auch gemeint, war spät gestern, müde ... musste nach Hause.
@Traumzauberbaum:
Das Problem ist schon beim ersten Beispiel vorhanden.
Versuch doch mal eine Variable vom Typ CUse zu erstellen. Es ist unmöglich, weil der Parameter T rekursive Beschränkungen hat. Das was du als T bei CUse eingibst, will er auch als T bei CTest einsetzen. Beispiele:CUse<CTest<int>> => Constraint nicht erfüllt weil T != CTest<CTest<int>
CUse<CTest<CTest<int>>> => Constraint nicht erfüllt weil T != CTest<CTest<CTest<int>>>In deinem zweiten Beispiel äußert sich das dann verstärkt. Der Parameter bei CTest kann nur ein struct sein, aber bei der Definition von CUse kann der Parameter nur vom Typ CTest<T> sein => Widerspruch. Wenn du class für Referenztypen genommen hättest, würde er zwar so compilieren, aber es ist wieder unmöglich eine Variable von dem Typ zu erstellen.
hmm, leuchtet mir halbwegs ein ... probiers mal mit einem Interface.
Danke, Harry
Hallo mitsammen,
ich hab ein kleines Problem bei der Vereinbarung der Parameter von generischen Klassen. Ich will eine generische Klasse die nur Klassen zulässt die von einer generischen Klasse abgeleitet wurden. Die Basisklasse legt in der Vereinbarung fest das nur Referenztypen zugelassen sind.
/* Beispiel 1: Basisklasse ohne Constraint */
public class CTest<T> { }
public class CUse<T> where T : CTest<T> { } /* das funktioniert */
/* Beispiel 2: Basisklasse mit Constraint */
public class CTest<T> where T : struct { }
public class CUse<T> where T : CTest<T> { } /* da bekomm ich dann einen Fehler (CS0453) */
Der Fehler besagt das ich nur Referenztypen verwenden kann (korrigiert mich wenn das nicht stimmt). Wie muss in Beispiel 2 das Constraint lauten damit es funktioniert?
Grüsse, Harry
Wenn Du das Objekt selbst explizit zerstören willst, solltest Du Dir mal das IDisposable-Interface ansehen.
Das stimmt so nicht, Dispose() dient zur Freigabe von unmanaged Resourcen, das Objekt wird dadurch nicht "zerstört". Solange eine Referenz auf ein Objekt existiert wird es vom GC nicht freigegeben, egal ob du es "disposed" oder nicht.
Freund Nummer 1: Suchfunktion im Forum
Freund Nummer 2: Google
Freund Nummer 3: Newsgroup
Ich garantiere dir dass du damit schnell an dein Ziel kommen wirst! 😉
und will man unions dennoch verwenden, aus welchen gründen auch immer, kannst du sie mit c# nachbilden, stichwort LayoutKind.Explicit
wenn man es mal besser weiss als der compiler besteht die möglichkeit warnungen mittels
#pragma warning disable NUMMER
#pragma warning restore NUMMER
zu unterdrücken.
Aber:
warnungen sollte man stets beachten, sie werden nicht ohne grund ausgegeben und sind zumeist schnell behoben.
Wenn man z.B. einen 1 Pixel breiten Strich darstellen möchte, muß man wieder den Pen skalieren, damit das auch klappt.
einen 1 pixel breiten pen bekommst du wenn du beim erzeugen des pens width mit 0 belegst!
ansonsten schliesse ich mich herbivore an, wenn ich pixelgenau zeichnen will arbeite ich mit GraphicsUnit.Pixel und skaliere selbst. GraphicsUnit.Millimeter/PageScale hat mir gute dienste geleistet als ich objekte von cad zeichnungen darstellen musste.
aus der msdn
(using) Definiert einen Bereich, außerhalb dessen Objekte verworfen werden.
wparam ist schon richtig, nur ist PBT_APMSUSPEND eine konstante und kein string.
ich vermute das der zugriff auf bc
bc.Client.Send(bytes);
die exception auslöst.
schau dir dieses beispiel an, ich denke das löst dein problem
Von Form2 auf Form1 zugreifen.
Original von dr4g0n76
Frag GetCursorPos in einem Timer ab. Dann brauchts du keine Hooks.[DllImport("user32.dll")]
static extern bool GetCursorPos(out Point lpPoint);
erinnert mich irgendwie an kbhit() X(
ausserdem will er ja auch keyboard events mitbekommen!
ScaleTransform vergrössert bzw. verkleinert deine Zeichenausgaben, negative Werte spiegeln deine Grafiken auf der entsprechenden Achse. In der deutschen MSDN findest du eine Webcastserie die sich mit GDI+ auseinandersetzt.
vielleicht hilft dir das weiter
http://www.codeproject.com/csharp/NetWin32Hooks.asp
du erreichst das mit Nullpunktverschiebung und Skalierung, das Graphics Objekt bekommst du zB. im Paint Event.
Graphics.TranslateTransform(Graphics.ClipBounds.Width, Graphics.ClipBounds.Height);
Graphics.ScaleTransform(1, -1);
in solchen fällen kannst du dir auch den code abgucken den dir die ide generiert wenn du mit dem designer ein control einfügst. als ausgangspunkt immer wieder gut zu gebrauchen.
Original von Lynix
Ein einfaches Beispiel wo man dieses using häufig sieht ist bei der Verwendung von Funktionen File.Exists oder Directory.ExistsWenn man nach der Verwendung einer dieser Funktionen nicht explizit dafür sorgt, dass das Handle auf die Datei / das Verzeichnis wieder freigegeben wird, ist die Datei anschliessend einfach für alle weiteren Zugriffe gesperrt.
Da File.Exists bzw. Directory.Exists statische Methoden sind, gibts leider keine Möglichkeit explizit ein Dispose aufzurufen daher hilft da nur noch die Definition eines using-Blocks. Dieses sorgt dann dafür, dass die Datei / das Verzeichnis am Ende des Blocks wieder freigegeben wird.
die msdn sagt
The using statement allows the programmer to specify when objects that use resources should release them. The object provided to the using statement must implement the IDisposable interface. This interface provides the Dispose method, which should release the object's resources.
die klasse File ist static und solche können keine schnittstellen implementieren. um using zu verwenden muss das objekt aber IDisposable implementiert haben.
obwohl das thema schon erledigt ist, hier ein link der das mythos um dispose ausführlichst erklärt!
du musst beim refreshen die alten items löschen, siehe listviewname.items.clear()
schau mal unter System.Windows.Forms.Cursor.Clip
diverse fragen werden hier beantwortet
MSDN Blogs > Cool Client Stuff > Client Settings FAQ
vielleicht hilft dir dieser link weiter
http://www.mikrocontroller.net/forum/read-8-160474.html
dieses problem hab ich auch, es handelt sich anscheinend um einen bug.
guckst du http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=20d0d9f9-2625-44f3-8542-35577f6073d6
guckst du
http://support.microsoft.com/kb/834886/DE/?FR=1
xp prof. hat den treiber schon installiert