Zum Inhalt springen

Kati82

Mitglieder
  • Gesamte Inhalte

    108
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von Kati82

  1. Kati82

    [C++/CLI] Callbacks

    Ich hab zumindest die Ursache raus, glaube ich. In dem ReceiveThread speichere ich doch das, was angekommen ist in einen String. Was ich im Anhang weggelassen habe, ist, dass ich den String per Invoke an mein Form weiterleite und dass es den String dort in eine RichTextbox anhängen soll. Das hatte ich nur gemacht, damit ich sehe, was passiert und was alles ankommt. Wenn ichs weglasse, gehts.
  2. Kati82

    [C++/CLI] Callbacks

    Was ist, wenn der Nutzer 50.000 Bytes pro Schleife versenden möchte. Und dazu nochmal eine Schleifenanzahl von sagen wie mal 500. Also bei mir reicht das schon aus, dass das Programm zwei drei Minuten zu tun hat, bis es fertig ist. Wenn die Anzahl noch größer sein sollte, dann dauert das ja ewig. Ich muss noch dazu sagen, dass ich dem Nutzer die Möglichkeit geben möchte, ne Endlosschleife durchführen zu lassen. Und wenn man die nicht abbrechen kann, wäre das äußerst schlecht. Mit der while-Schleife hast du Recht. Danke. Da war ich wohl auf dem Holzweg, weiß auch nicht mehr, warum ich das gemacht habe. Und auch wegen dem ReceiveThread scheinst du Recht zu haben. Kann mir aber noch nicht erklären, warum das so ist. Muss ich noch näher untersuchen.
  3. Kati82

    [C++/CLI] Callbacks

    Ok, welche Reifen man nehmen benutzen sollte, hängt von der Jahreszeit ab. Und ich nahm an, dass aufgrund meiner Beschreibung, was ich machen möchte, man so eine gewisse Abhängigkeit erkennen kann. Wenn nicht, dann tuts mir leid. Ich kann halt manchmal meine Probleme nicht so richtig verständlich machen. Ich habe jetzt meinen Client zum Laufen gebracht (siehe Anhang). Habe mal versucht nur den wesentlich Teil zu zeigen (hoffentlich habe ich nichts wichtiges weggelöscht). Wenn ich im Form den Test starte, dann springt das Programm in die Funktion SendInLoop (als neuer Thread) rein. Wie man sieht läuft das ganze jetzt über select. Ich finde, das ganze läuft eher suboptimal. Das ne große Schleife viel Zeit frisst ist mir auch klar. Aber obwohl ich die ganze Verarbeitung in extra Threads mache, friert mein GUI ein. Obwohl es das auch schon wieder nicht ganz trifft. Es reagiert halt alles sehr stark verzögert. Auch die CPU-Last macht (verständlicherweise) einen großen Sprung nach oben - aber das wird man wohl bei ner großen Schleife nicht verhindern können. Das bringt mich zu der Annahme, das mein Programm stark verbesserungswürdig. Wenn sich also jemand mal kurz den Quellcode anschauen würde und mir etwas konstruktive Kritik oder Verbesserungsvorschläge geben kann, wäre ich sehr dankbar. TCPclient.txt
  4. Kati82

    [C++/CLI] Callbacks

    Nachdem der Client mit Senden und empfangen fertig ist kommt diese Fehlermeldung (also nix mit Exception oder so). Es wird auch keine Zeile oder so angegeben. NetworkTest.exe hat ein Problem festgestellt und muss beendet werden. ... und das übliche Bla Bla, ob der Problembericht gesendet werden soll. Hab aber gerade eben herausgefunden, dass es irgendwie an der Terminierung des Empfangspuffer liegt. Da muss ich nochmal genauer nachschauen. Und solche blöden Sprüche auch nicht. Ich hab doch beschrieben, was ich machen will. Soll ich meine Frage umformulieren? Mal ganz unabhängig von meinem Code: Wenn ich das Empfangen unabhängig vom Senden machen möchte (kein Echo machen), ist es dann besser WSAAsyncSelect zu benutzen oder doch lieber select? Mit select (synchron) scheints ja zu funktionieren. Aber nachdem was ich in Büchern und Internet gelesen habe, ist wohl WSAAsyncSelect (asynchron) besser. Stimmt diese Vermutung? Die Antwort soll auch übrigens nicht mein Problem lösen, sondern eher zu einem besseren Verständnis für Socketprogrammierung meinerseits.
  5. Kati82

    [C++/CLI] Callbacks

    Hallo nochmal, ich muss zwecks der Threadsynchronisierung nochmal was fragen. Im Allgemeinen heißt es doch, man soll Threads synchronisieren, wenn mehrere Threads auf einen Datenbereich zugreifen. Ich hatte jetzt angenommen, dass das in meinem Fall der Socket ist. Also hab ich mir überlegt, was passiert, wenn ich zwei Sockets mache (einen zum Senden und einen zum Empfangen). Ich hatte gedacht, dass ich dann unterschiedliche Datenbereiche benutze? Scheinbar nicht, denn da stürzt mein Programm auch ab. Was ist in meinem Fall dieser Datenbereich, wenn nicht dieser Socket? Oder liegts dann doch am Server? Und um nochmal zu meiner ursprünglichen Frage zurückzukommen, WSAAsyncSelect ja oder nein? Gruß Kati82 P.S.: Ich nutze eigentlich die ganz normalen WinSockets (winsock2.h). Das es unter .Net noch Sockets gibt, wusste ich anfangs nicht. Ich hab aber keine Lust das jetzt alles umzuschreiben.
  6. Gabs nicht auch ein listbox.SelectedItem.Text oder ein listbox.SelectedText? Kann mich auch irren, aber bei irgendeinem Control habe ich letztere Eigenschaft schon gesehen. Oder möchtest du mehrere Einträge in einer Textbox anzeigen lassen? Dann müsstest du zusätzlich mit ner Schleife arbeiten. Gruß Kati82
  7. Kati82

    [C++/CLI] Callbacks

    Ist mir auch klar, dass das mit dem Sleeps nicht gut ist. Deswegen suche ich ja schon nach einer Lösung. Wenn du sagst, ich muss mich um die Synchronisierung kümmern, dann lag ich wohl mit dem AsyncSelect vollkommen falsch? Ich will halt das Empfangen unabhängig vom Senden machen. Und ich dachte dazu wäre das AsyncSelect da.
  8. Kati82

    [C++/CLI] Callbacks

    Ähm ja, also ich will alles mögliche über Sockets lernen. Hintergrund ist der, dass ich ein Testprogramm schreibe. Dieses verbindet sich mit einem anderen Gerät (Server). Eigentlich gibt der Server nur das Echo zurück, mehr nicht. Jetzt hatte ich eigentlich vor, zwei Threads zu machen. In dem einen wird in einer Schleife (Nutzer gibt Schleife an) immerzu gesendet. In dem anderen wollte ich nur empfangen. Leider hat das nicht so funktioniert wie ich wollte. Habe mit select gearbeitet. Trotzdem ist mein Programm immer ab einer bestimmte Paketgröße oder einer bestimmten Anzahl von Schleifen abgestürzt. Wenn ich allerdings ein Thread::Sleep eingebaut habe, dann ging alles. Ich möchte aber keine Wartezeit einbauen, da das später evtl die Ergebnisse verfälschen könnte. Server-seitig habe ich alles überprüft, da kommt alles an, was ankommen soll und er sendet auch alles wieder korrekt raus. Der Absturz erfolgt also aus meiner Sicht nachdem eigentlich schon alles ordnungsgemäß gesendet und empfangen wurde. Und jetzt wollte ich eben ausprobieren, ob dieses WSAAsyncSelect eine Lösung für mein Problem wäre. Weiß aber eben noch nicht ganz wie ich das anwenden muss.
  9. Kati82

    [C++/CLI] Callbacks

    Wie jetzt? Ich dachte das WSAAsyncSelect ist dazu da, dass wenn eins von den genannten Sachen eintritt, das Programm in diesen Callback reinspringt, und das dort abhängig vom Event in die entsprechende Funktion reingesprungen wird. Hab ich das bis dahin richtig verstanden? Ich versuchs mal am Beispiel von Receive. Hab nen Socket erstellt WSAAsyncSelect gemacht und mich erfolgreich verbunden. Jetzt werde Daten zu meinem Socket gesendet. Das heißt ein Event müsste ausgelöst werden. Das Programm sollte jetzt in meine Notify-Funktion reinspringen, feststellen dass das Event ein FD_READ ist und damit in die Funktion zum lesen reinspringen. Mein Problem liegt jetzt also bei dem Event. Ich weiß nicht, wie ich das abfangen soll. Ich dachte, man macht das mit diesem Callback. Und ich dachte, ich muss dem Programm nur noch irgendwie verklickern, dass es im Falle eines solchen Events in diesen Callback reinspringen soll. Bin jetzt irgendwie total verwirrt.
  10. Kati82

    [C++/CLI] Callbacks

    Hallo, ich würde gerne eine CALLBACK-FUNKTION programmieren, nur leider habe ich keinen blassen Schimmer wie das geht. Das Internet hat mir bis jetzt auch noch nix greifbares ausgespuckt. Kann mir jemand eventuell ne Link sagen, wo das übersichtlich erklärt wird? Ich möchte nämlich bei meinem Socketprogramm mit WSAAsyncSelect arbeiten. Das hier habe ich bisher: int wRet = WSAAsyncSelect(client, GetForegroundWindow(), WM_USER+1, (FD_ACCEPT | FD_READ | FD_WRITE | FD_CLOSE)); ... LRESULT CALLBACK CTcpTest::OnNotifyWSAAsyncSelect(HWND hWnd, UINT uMessage, WPARAM, LPARAM lParam) { ... } Verständlicherweise kommt man nie in die Funktion OnNotifyWSAAsyncSelect. Ich muss noch irgendwie angeben, dass er bei solchen WSA-Events in diese Funktion reinspringen soll. Aber ich weiß weder wie, noch wo ich das machen muss. Etwa direkt vor dem WSAAsyncSelect? Als Form möchte ich mein bestehendes MainForm nehmen. Kann mir bitte jemand weiterhelfen? Viele Dank im voraus. Gruß Kati82
  11. Soweit ich weiß kannst du mit Datasets mehrere Tabellen, also DataTables, zusammenfassen. Wenn du nur eine Tabelle hast, brauchst du also nicht unbedingt ein Dataset.
  12. Ich glaub, das hat sich erledigt, das kann man nicht einstellen. Wäre ja auch sinnlos, weil ein TCP-Paket auch nur ein bestimmte Länge hat. Ab einer bestimmten Größe muss halt segmentiert werden. Trotzdem noch ne andere Frage. In meinem Client-Programm habe ich ausversehen mal auf den Button Senden gedrückt, ohne dass ich mich vorher zum Server verbunden habe. Logischerweise kommt dann eine Fehlermeldung beim Senden. Der Server macht nur ein Echo von dem, was der Client gesendet hat. Wenn ich mich jetzt mit dem Server verbinde und noch einmal sende, dann kommt auch noch ein echo vom vorigen Sendeversuch. Das heißt, also das die Daten vorher in irgendeinen internen Puffer zwischengespeichert wurden. Kann mir jemand sagen, wie man diesen Puffer leeren kann. Das würde sonst meine Testergebnisse verfälschen. Gruß Kati82
  13. Hier der Link: CAsyncSocket::SetSockOpt Ach Mist! Ich habe gerade gelesen, das gerade dieses nicht von WinSocket unterstützt wird. Manchmal sollte man halt auch das Kleingedruckte lesen. Da muss ich mir jetzt mal Gedanken drüber machen, ob man diese Option nicht noch irgendwie anders setzen kann. Ich möchte nämlich einen Test schreiben, bei dem der Anwender die Puffergröße angibt, und dieses dann im ganzen gesendet wird und nicht irgendwie auf mehrere Telegramme aufgeteilt wird.
  14. Hallo, ich hab da nochmal ne Frage zur Socketprogrammierung. Ich möchte gern die Option SO_SNDLOWAT mit setsockopt() setzen. Leider kommt immer eine Fehlermeldung zurück, wenn ich diese Funktion ausführe (Fehlercode 10042: bad protocol option). In der MSDN ist diese Option mit aufgeführt, also gehe ich mal davon aus, dass ich SO_SNDLOWAT auch unter Windows benutzen kann. Deshalb die Frage, ob es bestimmte Voraussetzungen gibt um diese Funktion setzen zu dürfen. Darf ich diese Eigenschaft zum Beispiel benutzen, wenn mein Client (bei dem ich das setzen möchte) bereits mit dem Server verbunden ist? Müssen beim Server die gleichen Eigenschaften gesetzt werden, oder reicht es wenn ein Kommunikationspartner diese Eigenschaft setzt? Ich hoffe auf eure Hilfe. Danke. Gruß Kati82
  15. Hallo, könntet ihr eventuell mal einen kurzen Blick auf meinen Code werfen. Ich versuche mich gerade an einem Timer, aber es funktioniert mal wieder nicht. UpdateResults^ updRes = gcnew UpdateResults(myControl); AutoResetEvent^ autoEvent = gcnew AutoResetEvent( false ); TimerCallback^ tUpdate = gcnew TimerCallback(updRes, &UpdateResults::OnTimedEvent); Threading::Timer^ stateTimer = gcnew Threading::Timer( tUpdate,autoEvent,0,1000); Jetzt bekomme ich aber in der Zeile mit dem TimerCallBack diese Fehlermeldung: error C3350: 'System::Threading::TimerCallback' : a delegate constructor expects 1 argument(s) Das verstehe ich nicht. Ich weiß zwar, dass man den ersten Parameter weglassen kann, aber ich brauche diesen Parameter in meinem Timer. Kann mir jemand weiterhelfen wie ich das Problem lösen kann? Ich komm irgendwie nicht dahinter. Vielen Dank im voraus. Gruß Kati82
  16. Kati82

    Frage zum Multi-Threading

    Hallo nochmal. also das mit dem Threadpool habe ich jetzt hinbekommen. Aber trotzdem kapiere ich die Funktionsweise nicht von dem ThreadPool. Ich wollte den Threadpool ja deswegen benutzen, weil ich ein Thread habe in dem Daten gesendet werden. Und wie ich bereits geschrieben habe, kann dieser Thread sehr häufig hintereinander gestartet werden. Bei einem Klick auf den Button Abbrechen sollten natürlich alle gestarteten Sende-Threads beendet werden. Wenn aber kein ThreadPool vorhanden ist, wird nur ein Thread beendet. Dazu kommt dann noch, dass die Verbindung geschlossen wird, aber die anderen noch laufenden Threads senden wollen. Das führt natürlich zu Fehlermeldungen. Jetzt habe ich das mit dem ThreadPool eingebaut. Alles funktioniert soweit. Ich versteh nur nicht, dass auf einmal keine Fehlermeldungen mehr kommen, wenn ich auf Abbrechen (Verbindung schließen) drücke, weil ich noch überhaupt nichts programmiert habe, dass der ThreadPool abgebrochen werden soll. Wobei ich nebenbei gesagt, gar nicht weiß wie das geht, bzw. ob man das überhaupt machen muss. Kann mir jemand eventuell mal dieses Verhalten erklären? Wäre euch sehr dankbar. Gruß Kati82
  17. Kati82

    Frage zum Multi-Threading

    Also ich versteh das mit dem ThreadPool noch nicht so ganz. Habe das jetzt genau so implementiert wie in dem MSDN Beispiel. Allerdings ist meine Methode, die dann vom ThreadPool aus gestartet werden soll, nicht static bei mir. Ich möchte auch nicht, dass die static ist, weil dann ein Haufen Fehlermeldungen kommen und ich somit die Methode umschreiben müsste. Jedenfalls kommt dann bei mir schon folgende Fehlermeldung wenn ich es als nicht static belasse: error C3352: 'void NetworkTest::CTcpTest::SendData(System::Object ^)' : the specified function does not match the delegate type 'void (System::Object ^)' Die Meldung komt übrigens bei dem QueueUserWorkItem. Was kann ich da jetzt tun? @SoL_Psycho: Ich bin doch schon dabei!
  18. Kati82

    Frage zum Multi-Threading

    Aber wie geht das dann? Beim ThreadPool gibts ja kein Abort() oder ähnliches.
  19. Hallo, ich steh mal wieder aufm Schlauch und ich hoffe ihr könnt mir helfen. Ich habe einen Button, wenn man auf den klickt, wird ein Thread gestart, in dem ein Timeout eingebaut ist. Somit kann es manchmal ein paar Sekunden dauern bis der Thread beendet wird. Das Problem was ich jetzt habe ist, wenn der Anwender sehr schnell hinter einander den Button drückt, dann habe ich ja ganz viele (gleiche) Threads am laufen. Und jetzt möchte ich, dass mit einem Abbrechen-Button, alle diese Threads beendet werden. Wie mache ich das jetzt am besten? Macht man das mit so einem ThreadPool? Oder gibts da noch was anderes? Gruß Kati82
  20. Wie es genau geht, weiß ich auch nicht. Aber ich weiß, dass die drei Felder zum Minimieren, Maximieren und zum Schließen des Form "ControlBox" heißen. Vielleicht gibt es ja für die ein Event, was du abfragen könntest. Gruß Kati82
  21. Kati82

    [C++ .NET] aus X mach X,00

    Ok, warum kompliziert, wenns auch einfach geht. :upps
  22. Kati82

    [C++ .NET] aus X mach X,00

    Danke. Habs über CultureInfo und NumberFormatInfo hinbekommen. Finde das allerdings blöd, dass man diesen Weg über die CultureInfo gehen muss.
  23. Kati82

    [C++ .NET] aus X mach X,00

    Und wie geht das mit 3 Stellen nach dem Komma? Gruß Kati82 P.S.: Nutze C++/ CLI
  24. Kati82

    DataGridView speichern?

    Also hier der Code zum Schreiben in die Datei. Habe auch überprüft, ob was in der Tabelle steht. Ist auch unabhängig davon, wie viele Spalten es gibt. Mit den Streams bin ich auch noch etwas ungeübt. Sieht vielleicht etwas komisch aus, aber es funktioniert. System::Void Form1::bCSVExport_Click(System::Object^ sender, System::EventArgs^ e) { long count = dgvResults->ColumnCount; StreamWriter^ csvStream; // Open SaveDialog SaveFileDialog^ saveDialog = gcnew SaveFileDialog; saveDialog->Filter = "CSV Files (*.csv)|*.csv|All files (*.*)|*.*"; saveDialog->FilterIndex = 1; // Is dgvResults empty? if (dgvResults->Rows->Count > 1) { if (saveDialog->ShowDialog() == ::DialogResult::OK) { Stream^ sFile; try { sFile = saveDialog->OpenFile(); } catch (System::Exception ^exp) { MessageBox::Show(exp->ToString(), "Error"); return; } csvStream = gcnew StreamWriter(sFile); if ( csvStream != nullptr ) { long columns = dgvResults->ColumnCount; long rows = dgvResults->RowCount - 1; String^ strline; // Print the Header strline = ColNr->HeaderText; for(int i = 1; i < columns; i++) { strline += ";" + dgvResults->Columns[i]->HeaderText; } csvStream->WriteLine(strline); // Print the Table for (int i = 0; i < rows; i++) { strline = dgvResults[0,i]->Value->ToString(); for (int j = 1; j < columns; j++) { try { strline += ";" + dgvResults[j,i]->Value->ToString(); } catch (System::Exception ^) { strline +=";"; } } csvStream->WriteLine(strline); } } csvStream->Close(); String^ filename = saveDialog->FileName; // Open Excel try { System::Diagnostics::Process::Start(filename); Form1::BringToFront(); } catch (System::Exception ^exp) { MessageBox::Show(exp->ToString(), "Error"); return; } } } }[/PHP] Das Laden ist in meinem Fall nicht notwendig gewesen. Aber ich denke, das funktioniert genauso. Stream öffnen zum lesen und dann zeilenweise in das dgv oder die DataTable eintragen. Gruß Kati82 P.S.: sehe gerade, dass ich die aller erste Variable "count" nirgendwo gebrauche. Ich glaub die kann weg.
  25. Danke für die Antworten. Wollte nur sicher gehen, das ich das auch richtig verstanden habe.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...