Thread mit RS232
-
Nein, das kommt erst später, wie gesagt im moment erfolgt die gesammte Ansteuerung im Hauptthread, und im erzeugten Thread, habe ich nur die Zählschleife ohne jegliche Ansteuerung.
Deswegen verstehe ich das auch nicht warum er die "Verbindung verliert".
Ich wollte eigendlich erst dieses miese Problem gelöst haben bevor ich "ernsthaft"
weiter mache.
-
Achso... habs mri jetzt nochmals angeschaut: Du hast eindeutig einen Kommentar der im cpp-File jedes neuen Thread-Objektes steht nicht gelesen oder nicht befolgt. Da steht was bezüglich Synchronize. Lies es, wende es an.
Ausserdem solltest du dem Thread mindestens ein Sleep(0) / Schleifendurchlauf beibringen, damit das Betriebssystem die Prozessorzeit besser verteilen kann.
-
Ausserdem frage ich mich was der Aufruf von Terminate() im OnTerminate-Ereignis soll? Schon mal geschaut wann OnTerminate ausgeführt wird?
-junix
-
Ich habs mir nicht ausgedacht, habe das da im Beispiel gelesen, und es angewandt.
Ich glaub ich gebs langsam auf, ich füge das aus dem Beispiel ein und nur Fehler, weil logischerweise die Deklarationen fehlen, aber wie werden die wieder realiesiert?
Es muß doch irgendwo eine vernünftige Anleitung existieren die nicht die hälfte weglässt.
Ich kann nicht einmal das Beispielprojekt selber kompilieren weil ihm jetzt auf einmal bibliotheken fehlen, obwohl hier nun auch keine anderen verwendet werden.
-
Ich danke die Trotzdem für deine Mühen!!

-
mach doch mal das thread tut hier auf cplusplus.de..
habe ich auch mal gemacht und klappte super
-
http://bcb-tutorial.c-plusplus.net/inhalt.html
habe mich versucht an das zu halten.Wo befindet sich denn ein weiters?
die Seite www.cplusplus.de
ist in Überarbeitung.
und auf der des Forum ist nur der verweis auf verschiedene Bücher über die allgemeine Programmierung.
Habe 2 angetestet, aber nichts über Threads.gruß
Farnsworth
-
genau das meinte ich..
junix schrieb:
Ausserdem solltest du dem Thread mindestens ein Sleep(0) / Schleifendurchlauf beibringen, damit das Betriebssystem die Prozessorzeit besser verteilen kann.
junix schrieb:
Du hast eindeutig einen Kommentar der im cpp-File jedes neuen Thread-Objektes steht nicht gelesen oder nicht befolgt. Da steht was bezüglich Synchronize. Lies es, wende es an.
junix schrieb:
Ausserdem frage ich mich was der Aufruf von Terminate() im OnTerminate-Ereignis soll? Schon mal geschaut wann OnTerminate ausgeführt wird?
hast du diese kommentare mal überprüft und in deinem code angepasst?
was brauchst du für eine RS232-Komponente?
-
// Wichtig: Methoden und Eigenschaften von Objekten der VCL können nur in
// in Methoden verwendet werden, die Synchronize aufrufen, z.B.:
//
// Synchronize(UpdateCaption);
//
// wobei UpdateCaption so aussehen könnte:
//
// void __fastcall Unit2::UpdateCaption()
// {
// Form1->Caption = "In Thread aktualisiert";
// }Ich gehe davon aus das ihr das meint.
mit der Anwendung haperts so ein bißchen:(
ich habe mich da ans Beispiel Programm gehalten aber wie gesagt da fehlen im .lib dateien (warum auch immer, nur für das Programm).
Vielleicht kriege ich das in einer ruhigen Stunde mal hin, aber im moment versteh ich die Umsetzung nicht.Die Ansteuerung wird über die Port.dll gemacht die in der com.cpp deklariert wird.
Oder was meinst du mit Komponente?
-
was für einen BCB hast du?
und welche dateien fehlen?eine Komponente ist zum beispiel der Button den du oben aus der auswahl auf deine Form ziehen kannst.
hast du die com.cpp selber geschrieben?
-
ich habe den 5.0 prof.
vclado50.bpi
Dss50.bpi
VCLmid50.bpi
webmid50.bpi
turbodb41150.bpidie dateien fehlen
die com.cpp hat mein Lehrer in der Schule geschrieben, ich habe sie nur um dts etc. erweitert.
//Die Datei wird benötigt um auf die dll zugreifen zu können //Funktion ladeDLL() kann als globale Funktion //aufgerufen werden //Port.dll muss im aktuellen Verzeichnis stehen //Rückgabe = false - wenn DLL nicht geladen werden kann #include <vcl.h> HINSTANCE hdll; //hinstance ist ein Variablentyp der API Ebene typedef UINT(CALLBACK *open)(char *); //eigener Datentyp kreirt (Zeigerdatentyp auf eine Funktion) //Open ist der Name Zeiger auf Char muß übergeben werden, //unsigned int wird zurück geliefert. //Callback bringt das Betriebssystem ins Spiel open opencom; //Variable des neuen Datentyps wird angelegt ( Typ open) typedef UINT (CALLBACK *read)(); read readbyte; typedef (CALLBACK *send)(UCHAR); //5 mal für die 5 Funktionen die wir brauchen send sendbyte; typedef (CALLBACK *close)(); close closecom; typedef (CALLBACK *time_)(UINT); time_ timeout; typedef WORD (CALLBACK *dsr_)(); dsr_ dsr; typedef WORD (CALLBACK *rts_)(WORD); rts_ rts; typedef WORD (CALLBACK *txd_)(WORD); txd_ txd; typedef WORD (CALLBACK *dtr_)(WORD); dtr_ dtr; //Die funktionen müssen mit den existierenden Funktionen verknüpft werden //----------------------------------------------------- bool ladeDLL (void) { hdll = LoadLibrary("PORT.DLL"); if(hdll == NULL) { return false; //wenn false, dann datei nicht gefunden } else { opencom = (open)GetProcAddress(hdll,"OPENCOM"); //übergebe den handle auf die Datei readbyte = (read)GetProcAddress(hdll,"READBYTE"); //Beim aufruf in c wird dann die funktion in der dll ausgeführt sendbyte = (send)GetProcAddress(hdll,"SENDBYTE"); closecom = (close)GetProcAddress(hdll,"CLOSECOM"); timeout = (time_)GetProcAddress(hdll,"TIMEOUT"); rts = (rts_)GetProcAddress(hdll,"RTS"); txd = (txd_)GetProcAddress(hdll,"TXD"); dtr = (dtr_)GetProcAddress(hdll,"DTR"); return true; } }Also eine Komponente gibt es da nicht, das läuft direkt über diese Datei.
Im Programm schreibe ich dann einfach txd(1); und schon liegen da 12V an.Soweit so gut.
den Ventilator steuer ich dann über ein Schieberegister an.
-
Farnsworth schrieb:
Ich gehe davon aus das ihr das meint.
Genau
Farnsworth schrieb:
mit der Anwendung haperts so ein bißchen:(
Wieso?
-
hm, meinst du das so?
#include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" #include <windows.h> #include <time.h> #pragma package(smart_init) //--------------------------------------------------------------------------- // Wichtig: Methoden und Eigenschaften von Objekten der VCL können nur in // in Methoden verwendet werden, die Synchronize aufrufen, z.B.: // // Synchronize(UpdateCaption); // // wobei UpdateCaption so aussehen könnte: // // void __fastcall Unit2::UpdateCaption() // { // Form1->Caption = "In Thread aktualisiert"; // } //--------------------------------------------------------------------------- __fastcall PWM::PWM(bool CreateSuspended) : TThread(CreateSuspended) { FreeOnTerminate = true; } void __fastcall PWM::UpdateCaption() { Form1->Update(); Form1->Caption = "In Thread aktualisiert"; } //--------------------------------------------------------------------------- void __fastcall PWM::Execute() { int b=0; //---- Hier den Thread-Code plazieren---- Form1->Memo1->Lines->Add("-> Thread Arbeitet"); for (int i=0; i<200000; i++){ b=i; Form1->SpeedButton2->Caption = b; Synchronize(UpdateCaption); Sleep(0); } Form1->Memo1->Lines->Add (b); }und die Header
#ifndef Unit2H #define Unit2H //--------------------------------------------------------------------------- #include <Classes.hpp> //--------------------------------------------------------------------------- class PWM : public TThread { private: protected: void __fastcall Execute(); public: __fastcall PWM(bool CreateSuspended); void __fastcall UpdateCaption(); //Unsere Synchronize-Methode. }; //--------------------------------------------------------------------------- #endifDas Synchronize ist dann abgeschlossen, richtig?
Aber laufen tut es immer noch nicht.Im Beispiel beziehen die sich auf ein FileListBox->Update(), da ich sowas nicht habe, habe ich das HAuptformular gewählt.
-
Vielleicht solltest du aufhören einfach nur irgendwas zu kopieren und einzusetzen und dann zu hoffen es läuft und endlich mal nachdenken wieso du das machst... Falls du dich jetzt beleidigt fühlst, solltest du nochmals ganz genau ansehen was du gemacht hast.
-junix
-
Ich fühl mich nicht beleidigt, keine Sorge

Hast ja prinzipiell recht!!
Nur wenn ich das genau nachvollziehen könnte was ich da geschrieben(kopiert) habe, müsste ich hier nicht um Hilfe bitten.So wie du es schreibst muß es ein großer Bock sein, und ich werde ihn suchen.:)
Sind ja bald Sommerferien!
-
Farnsworth schrieb:
So wie du es schreibst muß es ein großer Bock sein,
ja
Lesen und nochmals nachdenken!
//--------------------------------------------------------------------------- // Wichtig: Methoden und Eigenschaften von Objekten der VCL können nur in // in Methoden verwendet werden, die Synchronize aufrufen, z.B.:
-
Ein Artikel (pdf-Format + sehr gut erklärt) über Threads im C++Builder
-
danke epsilon
@´junix
ich schätze hier steht was falsches drin
void __fastcall PWM::UpdateCaption()
{
Form1->Update();
Form1->Caption = "In Thread aktualisiert";
}aber da ich in der unit1 die port.dll verwende und keine "komponenten" verwende die im Objekinspektor stehen weis ich jetzt nicht genau was ich stattdessen schreiben soll.
-
Schon mal nachgelesen was Synchronize so treibt? -> Borland Hilfe, TThread->Methoden, Synchronize
-
habs nachgelesen,
#include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" #pragma package(smart_init) int b=0; //--------------------------------------------------------------------------- // Wichtig: Methoden und Eigenschaften von Objekten der VCL können nur in // in Methoden verwendet werden, die Synchronize aufrufen, z.B.: // // Synchronize(UpdateCaption); // // wobei UpdateCaption so aussehen könnte: // // void __fastcall Unit2::UpdateCaption() // { // Form1->Caption = "In Thread aktualisiert"; // } //--------------------------------------------------------------------------- __fastcall PWM::PWM(bool CreateSuspended) : TThread(CreateSuspended) { FreeOnTerminate = true; } void __fastcall PWM::UpdateCaption() { Form1->SpeedButton2->Caption = b; Form1->Caption = "In Thread aktualisiert"; } //--------------------------------------------------------------------------- void __fastcall PWM::Execute() { //---- Hier den Thread-Code plazieren---- Form1->Memo1->Lines->Add("-> Thread Arbeitet"); for (int i=0; i<200000; i++){ b=i; Synchronize(UpdateCaption); Sleep(0); } Form1->Memo1->Lines->Add (b); }hoffe richtig geändert, aber das Problem besteht weiterhin.