Austausch von Daten zwischen zwei EAs, die auf verschiedenen Terminals laufen - Seite 4

 

Eine Alternative zur Registrierung ist der einfache Dateiaustausch. (Ich meine das NTFS-Dateisystem)

Es gibt 2 Terminals c:\mt1, c:\mt2 in jedem von ihnen natürlich \experts\files

Erstellen Sie c:\mt1\experts\files\exchange c:\mt2\experts\files\exchange

Linkd-Befehl von Windows Server 2003 Resource Kit Tools (für Win 2000, 2003, XP) in Vista MKLINK erstellen

linkd.exe c:\mt1\experts\files\exchangec :\mt2\experts\files\exchange

ist dies nun ein gemeinsames Verzeichnis mit den Terminals. (Kopieren Sie eine beliebige Datei nach c:\mt1\experts\files\exchangeund suchen Sie nach c:\mt2\experts\files\exchange )

dasselbe kann mit Far - Alt F6 gemacht werden.

 
JavaDev >> :

Eine Alternative zur Registrierung ist der einfache Dateiaustausch. (Ich meine das NTFS-Dateisystem)

Es gibt 2 Terminals c:\mt1, c:\mt2 in jedem von ihnen natürlich \experts\files

Erstellen Sie c:\mt1\experts\files\exchange c:\mt2\experts\files\exchange

Linkd-Befehl von Windows Server 2003 Resource Kit Tools (für Win 2000, 2003, XP) in Vista MKLINK erstellen

linkd.exe c:\mt1\experts\files\exchangec :\mt2\experts\files\exchange

ist dies nun ein gemeinsames Verzeichnis mit den Terminals. (Kopieren Sie eine beliebige Datei nach c:\mt1\experts\files\exchangeund suchen Sie nach c:\mt2\experts\files\exchange )

Sie können dasselbe mit Far - Alt F6 tun.

Dennoch ist die Kommunikation über Dateien nicht das richtige Instrument. Nicht der richtige.

Dateien wurden erfunden, um Informationen zu speichern, und zwar für eine lange Zeit. Warum sollte man sich die Mühe einer Diskette machen? Es gibt RAM für die Kommunikation.

 
Andres >> :

Danach wird sie empfangen:

2009.05.19 01:22:16 2008.12.31 01:49 temp EURUSD,M1: ####
2009.05.19 01:22:16 2008.12.31 01:49 temp EURUSD,M1: RegCreateKeyExA(): Eine nicht existierende Partition wurde erstellt.
2009.05.19 01:22:16 Zeitarbeit zum Testen gestartet

Das heißt, der Inhalt des Puffers ändert sich nicht, obwohl beim Aufruf keine Fehler auftreten. Und die Registrierung enthält genau die Zeichenfolge "Test".

Von Forum Beiträge verstand ich, dass es wegen der ungewöhnlichen Zeichenfolge Übergabe von MQL-Umgebung zu DLL-Funktionen geschieht. In MQL-Umgebung arbeiten die Entwickler mit Strings mit ihren eigenen Manager (String-Pool), und anscheinend auf dieser Grenze der falsche Puffer gefüllt ist und daher können wir nicht sehen, das Ergebnis von API-Funktion zurückgegeben. Aber wenn wir Zeichenketten verwenden, die auf die gesamte Maximallänge initialisiert sind, dann gibt es, soweit ich sehen kann, kein Problem. Aus diesem Grund gibt es die 255 Zeichen lange Zeichenfolge "#". Das Zeichen "#" wurde gewählt, um die Zeichenfolge für das Auge sichtbar zu machen. Es hat nichts mit der Win-API selbst zu tun, denn es spielt keine Rolle, womit der Puffer vor dem Aufruf gefüllt ist. Dies ist die bereits erwähnte Begrenzung der Zeichenfolgenlänge. Sie können Strings, die länger als 255 Zeichen sind, an SetStringValue() übergeben, aber sie werden nicht gelesen.

Natürlich ist es gut, wenn es keine Einschränkungen gibt, aber ich sehe nicht, dass dies eine große Unannehmlichkeit darstellt. Das wirft die Frage auf: Warum müssen Sie eine Zeichenkette mit einer bestimmten Größe lesen? Wenn es um Einschränkungen geht, können Sie diese umgehen, indem Sie eine Funktion schreiben, die die Eingabezeichenfolge in N Parameter mit einer Länge von 255 + "Rest"-Parameter zerlegt. Und beim Lesen sammelt er sie wieder ein. Es gibt keinen anderen Weg. Wenn Sie Schwierigkeiten haben, kontaktieren Sie mich bitte, ich werde es tun. Einfach, jeder hat andere Bedürfnisse, wir können nicht alles bieten, es ist genug für mich nur diese, und jemand verwendet globale Variablen, und sogar auf mehreren Ebenen.

Ich bin verwirrt... Wo liegt die 255-Zeichen-Grenze? Ich weiß mit Sicherheit, dass es eine solche Einschränkung in MQL4 nicht gibt.

Der Beispielcode war ein subtiler Hinweis auf den Punkt :-))

 
Zhunko >> :

Dennoch ist die Kommunikation über Dateien nicht das richtige Instrument. Nicht das richtige Werkzeug.

Dateien wurden erfunden, um Informationen für eine lange Zeit zu speichern. Warum die Festplatte quälen? Es gibt RAM für die Kommunikation.

Ich stimme Ihnen teilweise zu.

Durch RAM können Sie, aber es ist schwierig (schließlich ist das Forum nicht 100% System-Programmierer und nicht einmal 50%).

Und wenn man es etwas weiter fasst - in Unix -, dann sind es all die Dateien und der Arbeitsspeicher und die Festplatten und Prozesse.

Ich habe nur eine von vielen Möglichkeiten vorgeschlagen.

 
Zhunko >> :

Ich versteh das nicht... Wo liegt die Grenze von 255 Zeichen? Ich weiß mit Sicherheit, dass MQL4 keine solche Einschränkung hat.

Das Codebeispiel war ein subtiler Hinweis auf den Kern der Frage :-))

Nun, wenn Sie während der Ausführung des Programms eine Zeichenkette inkrementieren, gibt es keine Einschränkung, aber dann stellt sich heraus, dass es sich nicht mehr um eine Zeichenkettenkonstante handelt. Die Dokumentation ist sehr eindeutig, was die Länge von String-Konstanten angeht :

Die Länge der Zeichenkettenkonstante liegt zwischen 0 und 255 Zeichen. Wenn die String-Konstante die maximale Länge überschreitet, werden die überflüssigen Zeichen nach rechts abgeschnitten und der Compiler gibt eine entsprechende Warnung aus.

 
Andres >> :

Nun, es gibt keine Einschränkung, wenn Sie die Zeichenkette während der Programmausführung erhöhen, aber dann ist sie keine Zeichenkettenkonstante mehr. In der Dokumentation ist die Länge von Stringkonstanten klar beschrieben:

In unserem Fall spielt es keine Rolle, ob es eine Konstante ist oder nicht.

Sie können also mehr mit einer Variablen machen?

 
Zhunko >> :

In unserem Fall spielt es keine Rolle, ob es eine Konstante ist oder nicht.

Sie können also mehr tun, mit einer Variablen?

Warum ist das nicht wichtig? Der Punkt ist, dass es wichtig ist (!), weil mit einem Puffer als eine konstante Zeichenfolge API-Aufruf funktioniert, wie es sollte, und mit einem Puffer von "dynamisch" erstellt String API-Aufruf funktioniert ohne Fehler, aber wir nicht beobachten, Daten aus der Registrierung in dieser Zeichenfolge, aus den Gründen, die zuvor beschrieben.


Andres schrieb >>
Wenn Sie während der Ausführung des Programms die Zeichenkette erhöhen müssen, hat sie keine Begrenzung, aber dann stellt sich heraus, dass sie keine konstante Zeichenkette ist. Die Dokumentation sagt, dass die Länge der String-Konstanten klar ist:

Hier ging es um die Begrenzung der Stringlänge, nicht um die Begrenzung der Bibliothek.

Versuchen Sie, Daten aus der Registrierung mit einer konstanten Zeichenkette und mit einer dynamisch inkrementierten Zeichenkette abzurufen, und Sie werden den Unterschied sehen. Im ersten Fall kommen die Daten an, im zweiten Fall nicht.

 
Andres >> :

Hier ging es um die Begrenzung der Stringlänge, nicht um die Begrenzung der Bibliothek.

Versuchen Sie, Daten aus der Registrierung abzurufen, indem Sie eine String-Konstante und einen dynamisch inkrementierten String verwenden, und Sie werden den Unterschied sehen. Im ersten Fall werden Daten empfangen, im zweiten Fall nicht.

>>...seltsam!... Es stellt sich also heraus, dass es darauf ankommt, wo in der Funktion der Speicher zugewiesen wird?

 

Der beste Weg , Daten zwischen Programmen auszutauschen, sind meiner Meinung nach virtuelle Dateien:

// Открываем объект-отображение FILE_MAP_READ

hMMF = OpenFileMapping( FILE_MAP_WRITE, FALSE, lpFileShareName);

// Если открыть не удалось, выводим код ошибки

if( hMMF == NULL) {

MessageBox(NULL,"OpenFileMapping: Error","RealTimeData", MB_OK );

return 0;

}

// Выполняем отображение файла на память FILE_MAP_READ 

// В переменную lpMMF будет записан указатель на отображаемую область памяти

lpMMF = MapViewOfFile( hMMF, FILE_MAP_WRITE,0,0,sizeof( NSDTfeedTick));

// Если выполнить отображение не удалось, выводим код ошибки

if( lpMMF == 0) {

MessageBox(NULL,"MapViewOfFile: Error","RealTimeData", MB_OK );

return 0;

}

//---

und so weiter.....

Alles funktioniert zuverlässig und störungsfrei.... Elektronisch getestet :)

 
klot >> :

Der beste Weg, Daten zwischen Programmen auszutauschen, sind meiner Meinung nach virtuelle Dateien:

und so weiter.....

Alles funktioniert zuverlässig und störungsfrei.... Elektronisch getestet :)

Völlig richtig. FileMapping ist ein großartiges Werkzeug, wenn auch nicht das einfachste. Sie könnten auch Pipes oder Mailslots ausprobieren.

Grund der Beschwerde: