Programmazione asincrona e multithread in MQL - pagina 2

 
Koldun Zloy:

Traduco quello che vi è già stato detto da un rappresentante della società di sviluppo MT:

Non si possono creare thread da MQL. Nemmeno con WinAPI.

Potete farlo solo scrivendo la vostra DLL.

WinAPI e usa la dll standard!

kernel32.dll
user32.dll

ecc.

Il lavoro in multithreading è inteso con le funzioni WinAPI, non con le funzioni mql.
Ma è un peccato che non si possa lavorare in multi-thread con le funzioni mql.

 
Roman:

WinAPI e usa dll standard!

kernel32.dll
user32.dll

Hmm, esattamente il contrario, WinAPI è implementato come librerie dinamiche kernel32.dll , user32.dll...

Non avete mai provato a scrivere in C++ puro una solita finestra di Windows con il testo "Hello Word!". - Ci sono esempi in rete, scrivi il tuo primo "Hello Word! - si schiarirà da solo ;)

 
Igor Makanu:

hmm, esattamente il contrario: WinAPI è implementato come librerie dinamiche kernel32.dll , user32.dll...

Non avete mai provato a scrivere in C++ puro una solita finestra di Windows con il testo "Hello Word!". - Ci sono esempi in rete, scrivi il tuo primo "Hello Word! - molte cose si chiariranno da sole ;)


Standard significava dll standard di Windows, standard non significa che sono statici .lib

Igor, stai andando nella direzione sbagliata...
Che cosa ha a che fare "Hello Word!" con l'inizializzazione della dll, e chiamare funzioni da essa nel tuo thread!

Per esempio:
C'è la funzione WinAPI MessageBoxW();
Deve essere chiamato nel proprio thread.

Per questo è necessario inizializzare la dll stessa e la funzione esportata, puoi fare un esempio di come farlo correttamente?

LoadLibraryW("user32.dll");
GetProccAddress(hMyDll, "MessageBoxW");
FreeLibrary(hMyDll);
и т.д.

Poi, dopo l'inizializzazione, chiamate MessageBoxW(); con CreateThread();
Dopo che la funzione è stata eseguita, rilascia la risorsa e chiude il thread.
Mi dai un esempio di come farlo correttamente in mql?

 
Attualmente sto lavorando su un sistema multi-thread. Ma non in MCL, ma in C++ standard. Ah, quanti rastrelli ci sono).
 
Roman:


Standard significava la dll standard di Windows, standard non significa che sono statici .lib

Igor, stai andando nella direzione sbagliata...
Che cosa ha a che fare "Hello Word!" con l'inizializzazione della dll, e chiamare funzioni da essa nel tuo thread!

Per esempio:
C'è la funzione WinAPI MessageBoxW();
Deve essere chiamato nel proprio thread.

Per questo è necessario inizializzare la dll stessa e la funzione esportata, puoi fare un esempio di come farlo correttamente?

Poi, dopo l'inizializzazione, chiamate MessageBoxW(); con CreateThread();
Dopo l'esecuzione della funzione, rilascia la risorsa e chiude il thread.
Mi dai un esempio di come farlo correttamente in mql?

Sei sulla strada sbagliata, ti è stato detto - scrivi una dll (in cui devi allocare memoria e registrare un nuovo thread! - poi distruggere attentamente tutto all'uscita!) e chiamarlo da MQL

dove sono l'allocazione della memoria e la registrazione del processo nel tuo esempio? La chiamata MessageBox - significa che il programma MQL ha allocato le sue risorse ma non ha creato un thread separato. Non voglio nemmeno controllarlo, ma il terminale dovrebbe bloccarsi quando MessageBox viene chiamato

 
Igor Makanu:

Stai andando nella direzione sbagliata, te l'ho detto - scrivi una DLL e chiamala da MQL

dove nel tuo esempio c'è l'allocazione della memoria e la registrazione del processo? il fatto che hai chiamato MessageBox - questo significa solo che il programma MQL ha fornito le sue risorse ma non ha creato un thread separato. non voglio nemmeno controllarlo, ma quando chiami MessageBox, il tuo terminale dovrebbe bloccarsi

Igor, ho citato le funzioni del dll di inizializzazione come esempio per capire di cosa sto parlando, ma non so come farlo correttamente in mql, il C++ puro può essere fuorviante.
La peculiarità di mql stesso può causare confusione. Ecco perché ho chiesto aiuto sul forum, non su Google.
Perché ho bisogno di scrivere una dll, quando WinAPI è costruita su dll, e le funzioni richiamabili sono già inuser32.dll, per esempio
? Ho creato l'argomento per capire la domanda, come farlo correttamente in mql, e mi dite dove è l'
allocazione della memoria e la registrazione del processo)).
Mi mostri un esempio corretto di come farlo in mql?
O indirizzarmi verso una buona guida.

 
Roman:

Igor, ho dato le funzioni di inizializzazione della dll come esempio per capire cosa intendo, ma non so come farlo correttamente in mql, il C++ puro può essere fuorviante.
La peculiarità di mql stesso può causare confusione. Ecco perché ho chiesto aiuto sul forum, non su Google.
Perché ho bisogno di scrivere una dll, quando WinAPI è costruita su dll, e le funzioni richiamabili sono già in user32.dll, per esempio
? Ho creato l'argomento per capire la domanda, come farlo correttamente in mql, e mi dite dove è l'
allocazione della memoria e la registrazione del processo)).
Mi mostri un esempio corretto di come farlo in mql?
O indirizzarmi verso una buona guida.

Non è possibile creare un thread dal programma mql, anche usando WinAPI.

 
Roman:

Igor, ho dato un esempio di funzioni di inizializzazione della dll per capire cosa intendo, ma come farlo correttamente in mql, non ne sono a conoscenza, il C++ puro può essere fuorviante.
La peculiarità di mql stesso può causare confusione. Ecco perché ho chiesto aiuto sul forum, non su Google.
Perché ho bisogno di scrivere una dll, quando WinAPI è costruita su dll, e le funzioni richiamabili sono già in user32.dll, per esempio
? Ho creato l'argomento per capire la domanda, come farlo correttamente in mql, e mi dite dove è l'
allocazione della memoria e la registrazione del processo)).
Mi mostri un esempio corretto di come farlo in mql?
O indirizzarmi verso una buona guida.

Ancora una volta, questo non si fa con il MQL, si risolve il problema dall'altro lato - dal lato della coda, non dalla testa!

Si scrive una dll - la si chiama da MQL e si passano dati alla dll, e se è necessario continuare il programma MQL (calcoli complessi), si crea un nuovo thread nella dll e si elaborano i dati in questo thread

Puoi leggere come scrivere una dll - cerca nel forum "dll" e troverai circa 20 articoli

Non ci sono tutorial, ma la risorsa che userete per scrivere una dll, quindi cercate soluzioni su come creare thread e così via.

 
Dmitry Fedoseev:

Non si può creare un flusso da un programma mql, nemmeno usando WinAPI.

Forum sul trading, sistemi di trading automatico e test di strategia

Programmazione asincrona e multithread in MQL

MetaQuotes Software Corp., 2019.07.24 16:31

Non si possono chiamare funzioni MQL da una DLL.

Ma è possibile eseguire più thread tramite chiamate DLL in modo che lavorino indipendentemente da MQL5 nel loro ambiente.

Per esempio, si preparano i dati da MQL, li si mette da qualche parte o li si passa alla DLL, che a sua volta eseguirà il compito in più thread e restituirà il risultato attraverso una funzione aggiuntiva.


Chiamare le funzioni API di Windows è una chiamata da dll, significa che i thread possono essere creati per le funzioni API di Windows usandoCreateThread();
Non per niente
CreateThread(); è stato portato alla libreria standard mql.

 
Roman:

Lachiamata delle funzioni API di Windows è una chiamata da dll, quindi per le funzioni API di Windows è possibile creare thread usandoCreateThread();
CreateThread(); è stato portato alla libreria standard mqlper un motivo.

nessuno ha fatto il porting di niente, quello che vedete nel pacchetto sono solo firme di funzioni.

per creare un flusso, avete bisogno di un corpo di funzione - questo è il corpo che verrà eseguito nel flusso!

Per registrare un thread in Windows è necessario compilare la struttura:

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES   lpThreadAttributes,
  SIZE_T                  dwStackSize,
  LPTHREAD_START_ROUTINE  lpStartAddress,
  __drv_aliasesMem LPVOID lpParameter,
  DWORD                   dwCreationFlags,
  LPDWORD                 lpThreadId
);

vedilpStartAddress - questo è l'indirizzo del punto di ingresso della funzione che verrà eseguita nel thread, non preoccupatevi dell'allocazione della memoria

per risolvere questo problema, è necessario trovare un'opportunità per ottenere l'indirizzo di MyFunc() - in memoria, ed è assente - beh, da nessuna parte ... nessuno!


Non so come altro spiegare il problema ... che non esiste realmente ))))

Motivazione: