Errores, fallos, preguntas - página 2239

 
Stanislav Korotky:

Yo también leo MSDN. Explícate, ¿es que Microsoft no sabe inglés o que ellos mismos no leen su documentación, o la última opción - las banderas en MQL tienen un nombre similar al de WinApi pero funcionan de manera diferente?

Tomado de aquí - https://docs.microsoft.com/en-us/windows/desktop/api/FileAPI/nf-fileapi-createfilea

FILE_SHARE_READ -Permite que las siguientes operaciones de apertura de un archivo o dispositivo soliciten acceso de lectura.De lo contrario, otros procesos no podrán abrir el archivo o dispositivo si solicitan acceso de lectura.

FILE_SHARE_WRITE -Permite que las siguientes operaciones de apertura de un archivo o dispositivo soliciten acceso de escritura.De lo contrario, otros procesos no podrán abrir el archivo o dispositivo si solicitan acceso de escritura.

Por lo tanto, el primer programa sólo necesita establecer FILE_SHARE_READ para que el segundo lo lea. FILE_SHARE_WRITE sólo si sabe que el segundo programa también escribirá en el archivo.

¿Puede dar un ejemplo de la diferencia de comportamiento?


En el enlace proporcionado, la descripción de las banderas no da una idea de cómo utilizarlas correctamente cuando se intenta abrir el mismo archivo más de una vez.

Basándose en los datos de su descripción, intente responder a la pregunta, ¿serían válidos el cuarto (hread_1) y el quinto (hread_2) del ejemplo siguiente?

   HANDLE hwrite     =::CreateFile(L"test.txt", GENERIC_WRITE,FILE_SHARE_READ,                   nullptr,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,nullptr);

   HANDLE hread_fail =::CreateFile(L"test.txt", GENERIC_READ, FILE_SHARE_READ,                   nullptr,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,nullptr);
   HANDLE hread_ok   =::CreateFile(L"test.txt", GENERIC_READ, FILE_SHARE_WRITE,                  nullptr,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,nullptr);

   HANDLE hread_1    =::CreateFile(L"test.txt", GENERIC_READ, FILE_SHARE_WRITE,                  nullptr,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,nullptr);
   HANDLE hread_2    =::CreateFile(L"test.txt", GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ,  nullptr,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,nullptr);

Te diré la respuesta de inmediato: estas llamadas no serán válidas

 
Stanislav Korotky:

Yo también leo MSDN. Explícate, ¿es que Microsoft no sabe inglés o que ellos mismos no leen su documentación, o la última opción - las banderas en MQL tienen un nombre similar al de WinApi pero funcionan de manera diferente?

Tomado de aquí - https://docs.microsoft.com/en-us/windows/desktop/api/FileAPI/nf-fileapi-createfilea

FILE_SHARE_READ -Permite que las siguientes operaciones de apertura de un archivo o dispositivo soliciten acceso de lectura.De lo contrario, otros procesos no podrán abrir el archivo o dispositivo si solicitan acceso de lectura.

FILE_SHARE_WRITE -Permite que las siguientes operaciones de apertura de un archivo o dispositivo soliciten acceso de escritura.De lo contrario, otros procesos no podrán abrir el archivo o dispositivo si solicitan acceso de escritura.

Por lo tanto, el primer programa sólo necesita establecer FILE_SHARE_READ para que el segundo lo lea. FILE_SHARE_WRITE sólo si sabe que el segundo programa también escribirá en el archivo.

Para evitar confusiones con estas banderas, sólo hay que asegurarse de que cuando abrimos un archivo, estas banderas permiten a otros procesos leer y/o escribir, no a nosotros mismos.

 
Alexey Viktorov:

Para evitar confusiones sobre estas banderas, basta con entender firmemente que cuando abrimos un archivo, estas banderas permiten a otros procesos leer y/o escribir, no a nosotros mismos.

Eso es exactamente lo que digo, es exactamente como entiendo la documentación de MS (en particular, el que abre un archivo para escribir puede permitir que otros compartan la lectura). La técnica de marcado recomendada hace lo contrario: el segundo proceso utiliza el indicador de escritura compartida para autorizar la lectura del archivo que se está escribiendo (es decir, pasa por alto el primer proceso para autorizar la lectura, aunque el primer proceso no haya implementado el permiso de escritura compartida). Esto suena incluso poco natural. En fin, me voy a leer las interpretaciones.

 
Stanislav Korotky:

Eso es exactamente lo que digo, así es como entiendo la documentación de MS (en particular, quien abre un archivo para escribir puede permitir que otros lo lean juntos).

No sólo se puede leer, sino también escribir. Y si va a haber alguna escritura compartida, cada proceso debe tener permiso de escritura compartida.

Stanislav Korotky:

El uso de banderas que se recomienda para resolver este problema supone lo contrario: que el segundo proceso utiliza la bandera de escritura para autorizarse a sí mismo a leer el archivo que se está escribiendo (es decir, como que se salta el primer proceso al aumentar su autorización, aunque el primer proceso no haya especificado el permiso de escritura compartida). Esto suena incluso poco natural. En fin, me voy a leer las interpretaciones.

Y esto es un error. El yo nunca permite nada ni se plantea ningún derecho a sí mismo. Las banderas FILE_SHARE_READ y FILE_SHARE_WRITE se refieren a los atributos de un archivo abierto. Si los atributos no incluyen el permiso del proceso que ya tiene el archivo en uso, el archivo no puede ser utilizado hasta que sea liberado.

Así es como funciona en esos ejemplos: El primer archivo abierto para escribir, permite que otros procesos lean, y el segundo al abrirlo intenta prohibir (no permitir) escribir al que ya está usando el archivo. Aquí es donde se pone un poco mal... Es como, quién se levantó primero, quién se va...

 
Alexey Kozitsyn:

Pregunta para los desarrolladores.

Existe una función de sincronización:

A veces me da este error:

Es decir, el indicador se ejecuta en USDJPY, y me da un error con el símbolo EURGBP. Al mismo tiempo hay un gráfico abierto de EURGBP en el terminal.

El error 4014 dice que:

No se puede llamar a la función del sistema

¿Cómo puede ser?

Podría ser que fuera generado por alguna otra llamada.

Utilice ResetLastError() antes de llamar a SymbolIsSynchronised

 
Slava:

Y así fue generado por alguna otra llamada.

Utilice ResetLastError() antes de llamar a SymbolIsSynchronized

Sí, ya lo hice... Resulta que si no está claramente escrito en la documentación de la función que se debe llamar a GetLastError() en caso de error, significa que la función no restablece el código de error. ¿Verdad?

 
Slava:

Además, me gustaría saber qué funciones podrían provocar este error en el indicador.

 
A100:
En mi caso, ServiceDesk escribe ahora que no puede reproducir... en consecuencia se requiere la ayuda de la sala ... un poco más tarde voy a describir en detalle qué y cómo

Así que en la solicitud #1530548 ServiceDesk no puede reproducir el error https://www.mql5.com/ru/forum/1111/page1628#comment_2702870 aunque tengo una reproducción constante incluso ahora (en la build 1881). Tras pensarlo un poco, me di cuenta de por qué. La respuesta es: porque tengo un ordenador lento (tableta)

Tuve la misma situación en el caso #1952509 con este problema https://www.mql5.com/ru/forum/1111/page2124#comment_6518537

ServiceDesk también informó al principio que no podía reproducir el error. Me costó mucho esfuerzo convencerme de que había un error después de todo... al final:

Equipo de apoyo 2018.02.10 22:35
Parece haber reproducido tu problema el viernes en una máquina débil con 39 gráficos.
Estaremos atentos. Pedirá datos adicionales si es necesario. Gracias.

Esto plantea la siguiente pregunta: ¿es necesario preocuparse por estos errores? O dejar que vivan su vida en paz... tal vez no vuelvan a aparecer -basta con tener un ordenador rápido, ¿no?

Estas preguntas surgen en el contexto de que una docena de otros gráficos con varios EAs/indicadores pueden convertir un ordenador rápido en uno lento (y un comerciante promedio utiliza exactamente una gran cantidad de EAs - por ejemplo https://www.mql5.com/ru/forum/267154/page5#comment_8164924 - 82 EAs se están ejecutando)... O incluso un ordenador lento puede volverse lento durante un corto periodo de tiempo debido a otras circunstancias (antivirus... otros programas... o el propio sistema ha asumido temporalmente casi todos los recursos).

Y entonces ocurrirá exactamente ese inexplicable fallo de 1 entre 100 (y por las leyes de la naturaleza ocurre naturalmente en el momento más inoportuno).

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2016.08.03
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
A100:

Así que en la solicitud #1530548 ServiceDesk no puede reproducir el error https://www.mql5.com/ru/forum/1111/page1628#comment_2702870 aunque tengo una reproducción constante incluso ahora (en la build 1881). Tras pensarlo un poco, me di cuenta de por qué. La respuesta es: porque tengo un ordenador lento (tableta)

La misma situación se dio en la solicitud #1952509 para este problema https://www.mql5.com/ru/forum/1111/page2124#comment_6518537

ServiceDesk también informó al principio que no podía reproducir el error. Me costó mucho esfuerzo convencerme de que había un error después de todo... al final:

Equipo de apoyo 2018.02.10 22:35
Parece haber reproducido tu problema el viernes en una máquina débil con 39 gráficos.
Lo vigilaremos. Pedirá datos adicionales si es necesario. Gracias.

Esto plantea la siguiente pregunta: ¿es necesario preocuparse por estos errores? O simplemente dejar que vivan su vida en paz ... tal vez no vuelvan a aparecer - es suficiente con tener un ordenador rápido, ¿no?

Estas preguntas surgen en el contexto de que una docena de otros gráficos con varios EAs/indicadores pueden convertir un ordenador rápido en uno lento (y un comerciante promedio utiliza exactamente una gran cantidad de EAs - por ejemplo https://www.mql5.com/ru/forum/267154/page5#comment_8164924 - 82 EAs se están ejecutando)... O incluso un ordenador lento puede volverse lento durante un corto periodo de tiempo debido a otras circunstancias (antivirus... otros programas... o el propio sistema ha asumido temporalmente casi todos los recursos).

Y entonces ocurrirá exactamente ese inexplicable fallo de 1 de cada 100 (y por las leyes de la naturaleza ocurre naturalmente en el momento más inoportuno).


No tengo un ordenador débil. Pero este error de apertura de archivos también se produce de vez en cuando.

 
Vladislav Andruschenko:
No tengo un ordenador débil. Pero este error al abrir un archivo también ocurre de vez en cuando.
Sobre todo porque usted no es un usuario común, y su trabajo es utilizado por muchísimas personas
Razón de la queja: