Problema di WindowScreenShot

 

Salve,

Nell'indicatore di costo WindowScreenShot funziona perfettamente.

Crea un'immagine a 5 minuti per esempio: 10:15,10:20, ecc...

E

Dopo un periodo (casuale) di tempo non funziona. Non scrive il file.

Perché?

GetLastError() non segnala l'errore.

Apparentemente tutto bene.


THX

 
ttechnik:

Salve,

Nell'indicatore di costo WindowScreenShot funziona perfettamente.

Crea un'immagine a 5 minuti per esempio: 10:15,10:20, ecc...

E

Dopo un periodo (casuale) di tempo non funziona. Non scrive il file.

Perché?

È perché il vostro codice, che non possiamo vedere, è rotto. Poiché non possiamo vedere il vostro codice non possiamo dirvi dove è rotto.
 
  ....
  WindowScreenShot(filename, X_pixels, Y_pixels); 
  int error=GetLastError();
  if (error!=0) Alert(TimeToStr(TimeCurrent(),TIME_SECONDS)," trade_mode:", trade_mode, " T_ScreenShot FileWrite0 error: (",Symbol(),"  ",error,"): ",ErrorDescription(error));
  
  int handle = FileOpen(filename, FILE_BIN|FILE_READ); 
  if (handle>-1)
    {
     error=GetLastError();
     if (error!=0) Alert(TimeToStr(TimeCurrent(),TIME_SECONDS)," trade_mode:", trade_mode, " T_ScreenShot FileWrite1 error: (",Symbol(),"  ",error,"): ",ErrorDescription(error));
     FileClose(handle);
    }
  
  int lasterror=GetLastError();
  if (lasterror!=0) Alert(TimeToStr(TimeCurrent(),TIME_SECONDS)," trade_mode:", trade_mode," T_ScreenShot, Schoted file open error: (",Symbol(),"  ",lasterror,"): ",ErrorDescription(lasterror));
  
RaptorUK:
È perché il tuo codice, che non possiamo vedere, è rotto. Dato che non possiamo vedere il tuo codice, non possiamo dirti dove è rotto.

errore=0

e lasterror =4103, connot open file

Perché?

 
ttechnik:

errore=0

e lasterror =4103, connot open file

perché?

Il nome del file è unico o riutilizzi i nomi dei file?
 
RaptorUK:
Il nome del file è unico o riutilizzi i nomi dei file?


unico
 
ttechnik:

unico
Come si fa a renderli unici?
 
  1. Non chiamare GetLastError() a meno che non ci sia un errore.
     WindowScreenShot(filename, X_pixels, Y_pixels); 
      int error=GetLastError();
      if (error!=0) Alert(TimeToStr(TimeCurrent(),TIME_SECONDS
    Cosa sono i valori di ritorno delle funzioni? Come si usano? - Forum MQL4
    if( !WindowScreenShot(filename, X_pixels, Y_pixels) ){
      int error=GetLastError();
      Alert(TimeToStr(TimeCurrent(),TIME_SECONDS ...
    }

  2.   int handle = FileOpen(filename, FILE_BIN|FILE_READ); 
      if (handle>-1)
        {
         error=GetLastError();
    
    Se FileOpen fallisce, handle == -1. Stai emettendo un avviso quando non c'è nessun errore e continui quando c'è.
 
RaptorUK:
Come si fa a renderli unici?



string timestamp = TimeToStr(TimeCurrent(),TIME_SECONDS);
filename = filename + "_" + timestamp +  ".gif";
 
ttechnik:


Da quello che posso vedere il tuo più grande problema è la tua gestione degli errori, come WHRoeder ha già menzionato, stai facendo un cattivo lavoro nel riportare gli errori quando/se si verificano. Per esempio non controlli nemmeno se WindowsScreenShot() ha funzionato o non ha funzionato ... fai le modifiche che WHRoeder ha suggerito e prova di nuovo. Il tuo nome di file non è unico. . . usate le hh:mm:ss dell'ora corrente, quindi ogni giorno è possibile sovrascrivere un file di un giorno precedente, se quel file è aperto in quel momento questo potrebbe causare un errore 4103.

Invece . . .

string timestamp = TimeToStr(TimeCurrent(), TIME_DATE|TIME_SECONDS);
filename = filename + "_" + timestamp +  ".gif";

. . . per aggiungere la data nel nome del file.

 
RaptorUK:

Da quello che posso vedere il tuo più grande problema è la tua gestione degli errori, come WHRoeder ha già menzionato, stai facendo un cattivo lavoro nel riportare gli errori quando/se si verificano. Per esempio non controlli nemmeno se WindowsScreenShot() ha funzionato o non ha funzionato ... fai le modifiche che WHRoeder ha suggerito e prova di nuovo. Il tuo nome di file non è unico. . . usate le hh:mm:ss dell'ora corrente, quindi ogni giorno è possibile sovrascrivere un file di un giorno precedente, se quel file è aperto in quel momento questo potrebbe causare un errore 4103.

Invece . . .

. . . per aggiungere la data nel nome del file.

lasterror è 4103, continua

l'errore è 0

.....e esco da MT4 e lo eseguo di nuovo, funziona correttamente

Dopo un periodo (casuale) di tempo non funziona. Non scrivere il file. Ma file, nome di file unico.

perché?


string timestamp = TimeToStr(TimeCurrent(),TIME_DATE )+"_"+TimeToStr(TimeCurrent(),TIME_SECONDS);
  for (int i= StringLen(timestamp); i>0; i--)
    if (StringFind(timestamp,":",i)!=-1 || StringFind(timestamp,".",i)!=-1) timestamp= StringSetChar(timestamp, i, '-');
          

string filename = mappa + CharToStr(92) + CharToStr(92) + Symbol();
filename = filename + "_" + timestamp +  ".gif";

int error;
if(!WindowScreenShot(filename, X_pixels, Y_pixels))
   { 
    error=GetLastError();
    if (error!=0) Alert(TimeToStr(TimeCurrent(),TIME_SECONDS)," trade_mode:", trade_mode, " T_ScreenShot FileWrite0 error: (",Symbol(),"  ",error,"): ",ErrorDescription(error));
   }
Alert(filename);  
int handle = FileOpen(filename, FILE_BIN|FILE_READ); 
if (handle>-1)
    {
     error=GetLastError();
     if (error!=0) Alert(TimeToStr(TimeCurrent(),TIME_SECONDS)," trade_mode:", trade_mode, " T_ScreenShot FileWrite1 error: (",Symbol(),"  ",error,"): ",ErrorDescription(error));
     FileClose(handle);
    }
else
   {  
    int lasterror=GetLastError();
    if (lasterror!=0) Alert(TimeToStr(TimeCurrent(),TIME_SECONDS)," trade_mode:", trade_mode," T_ScreenShot, Schoted file open error: (",Symbol(),"  ",lasterror,"): ",ErrorDescription(lasterror));
   }
 
ttechnik:

lasterror è 4103, continuare

l'errore è 0

.....e chiudo la MT4 e la faccio ripartire, funziona correttamente

Dopo un periodo (casuale) di tempo non funziona. Non scrive il file. Ma il file, nome del file unico.

perché?



Si prega di mostrare la parte del file di log che mostra gli errori . . .
Motivazione: