Ver Mensaje Individual
  #13
Antiguo 17 de abril de 2019, 21:59
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

Nitzer, estoy en ello, ¡lo prometido es deuda!

Lo que pasa es que lo estoy haciendo desde 0 porque no encontré el ejemplo del que hablaba y no tengo tiempo ni para estornudar...

Sólo para enseñarte mis avances, de momento no funciona bien:

Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01  RESP                       PIC S9(9) COMP-5.
  5.  01  SECURITY-DESCRIPTOR.
  6.      05  Revision               PIC X(1).
  7.      05  Sbz1                   PIC X(1).
  8.      05  sControl               PIC S9(4) COMP-5. *> SECURITY_DESCRIPTOR_CONTROL
  9.      05  sOwner                 PIC S9(9) COMP-5.
  10.      05  sGroup                 PIC S9(9) COMP-5.
  11.      05  Sacl                   PIC S9(9) COMP-5.
  12.      05  Dacl                   PIC S9(9) COMP-5.
  13.  
  14.  01  lpdwRevision               PIC S9(9) COMP-5.
  15.  
  16.  01  SECURITY-ATTRIBUTES.
  17.      05  nLength                PIC S9(9) COMP-5. *> The size, in bytes, of this structure
  18.      05  lpSecurityDescriptor   POINTER. *> A pointer to a SECURITY_DESCRIPTOR structure    
  19.      05  bInheritHandle         PIC 9(2) COMP-5.  *> A Boolean value that specifies whether the returned handle is inherited when a new process is created.
  20.  
  21.  01  dwStackSize                PIC 9(9) COMP-5. *> The initial size of the stack, in bytes. The system rounds this value to the nearest page. If this parameter is zero, the new thread uses the default size for the executable.
  22.  01  lpStartAddress             PROCEDURE-POINTER.
  23.  01  R-lpStartAddress REDEFINES lpStartAddress PIC 9(9) COMP-5.
  24.  
  25.  01  lpParameter                PIC 9(9) COMP-5.
  26.  01  dwCreationFlags            PIC 9(9) COMP-5. *> if 0 - The thread runs immediately after creation.
  27.  01  lpThreadId                 PIC 9(9) COMP-5. *> A pointer to a variable that receives the thread identifier.
  28.  PROCEDURE       DIVISION.
  29.      
  30.      MOVE POW-FALSE TO "Enabled" OF CmCommand1
  31.    
  32.      *>Advapi32.lib
  33. *    CALL "GetSecurityDescriptorControl" WITH STDCALL USING BY REFERENCE SECURITY-DESCRIPTOR
  34. *                                                           BY REFERENCE sControl
  35. *                                                           BY REFERENCE lpdwRevision
  36. *                                                           RETURNING RESP
  37.      
  38.      CALL "InitializeSecurityDescriptor" WITH STDCALL USING BY REFERENCE SECURITY-DESCRIPTOR
  39.                                                             BY VALUE 1
  40.                                                             RETURNING RESP
  41.      
  42.      IF  RESP = ZEROS
  43.          CALL "GetLastError" WITH STDCALL RETURNING RESP
  44.          
  45.          DISPLAY "ERROR GetSecurityDescriptorControl, RC: " RESP            
  46.          
  47.          EXIT PROGRAM
  48.      END-IF
  49.      
  50.      MOVE LENGTH OF SECURITY-ATTRIBUTES TO nLength
  51.      
  52.      SET lpSecurityDescriptor TO ADDRESS OF SECURITY-DESCRIPTOR
  53.      
  54.      MOVE H"00" TO bInheritHandle
  55.      MOVE 0     TO dwStackSize
  56.      
  57.      SET lpStartAddress TO ENTRY "RUTINA@0"
  58.      
  59.      MOVE 0 TO lpParameter
  60.    
  61.      *> Kernel32.lib
  62.      CALL "CreateThread" WITH STDCALL USING BY REFERENCE SECURITY-ATTRIBUTES
  63.                                             BY VALUE dwStackSize
  64.                                             BY VALUE R-lpStartAddress
  65.                                             BY REFERENCE lpParameter
  66.                                             BY VALUE dwCreationFlags
  67.                                             BY REFERENCE lpThreadId
  68.                                             RETURNING RESP
  69.                                            
  70.      IF  RESP = ZEROS
  71.          CALL "GetLastError" WITH STDCALL RETURNING RESP
  72.          
  73.          DISPLAY "ERROR CreateThread, RC: " RESP            
  74.          
  75.          EXIT PROGRAM
  76.      END-IF
  77.      
  78.      PERFORM 10 TIMES
  79.          INVOKE CmList1 "AddString" USING "¡Este es el Thread del Form!"
  80.      
  81.          CALL "Sleep" WITH STDCALL USING BY VALUE 1000
  82.      END-PERFORM                            


---------- Post añadido : 21:59 ---------- Post anterior : 22:42 ----------

Nitzer, malas noticias. Es posible hacerlo en COBOL, pero no en Fujitsu, porque el último no trabaja con parámetros BY VALUE. Es decir, necesitaríamos algo como esto:

Código COBOL:
  1.  IDENTIFICATION DIVISION.
  2.  PROGRAM-ID. "RUTINA".
  3.  
  4.  DATA DIVISION.
  5.  LINKAGE SECTION.
  6.  01  P-THREAD            POINTER.
  7.  PROCEDURE DIVISION WITH STDCALL LINKAGE USING BY VALUE P-THREAD.
  8.  

Y parece ser que la función que pasamos a la hora de crear el nuevo Thread lo necesita para poder gestionarlo:

Código CPP:
  1. DWORD WINAPI mythread(LPVOID lpParameter){

Así que, lo que se podría intentar es pasar por una pasarela en C (crear une DLL intermediaria). Pero para probar esto necesito aún más tiempo. No sé cuándo lo voy a poder hacer.

Así que de momento te propongo que pruebes la otra solución de usar Timers como funciones en un Thread separado, a mi me ha funcionado de maravilla.



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita