Puro Fujitsu COBOL.
El código mágico: (dejo el proyecto entero en adjuntos)
IMPORTANTE: si haces
DISPLAY, tienes que hacer el primero en el Thread el Form, luego haces el resto en el nuevo Thread.
Código COBOL:
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 RESP PIC S9(9) COMP-5.
01 lpStartAddress PROCEDURE-POINTER.
01 R-lpStartAddress REDEFINES lpStartAddress PIC 9(9) COMP-5.
01 lpParameter PIC 9(9) COMP-5.
01 lpThreadId PIC 9(9) COMP-5 VALUE 0.
01 CAMPO PIC X(20) IS EXTERNAL.
PROCEDURE DIVISION.
DISPLAY "Vamos allá..."
MOVE "Hola desde el Form!" TO CAMPO
MOVE POW-FALSE TO "Enabled" OF CmCommand1
SET lpStartAddress TO ENTRY "RUTINA@0"
*> Kernel32.lib
CALL "CreateThread" WITH STDCALL USING BY VALUE 0
BY VALUE 0
BY VALUE R-lpStartAddress
BY REFERENCE lpParameter
BY VALUE 0
BY REFERENCE lpThreadId
RETURNING RESP
IF RESP = ZEROS
CALL "GetLastError" WITH STDCALL RETURNING RESP
DISPLAY "ERROR CreateThread, RC: " RESP
EXIT PROGRAM
END-IF
Código COBOL:
IDENTIFICATION DIVISION.
PROGRAM-ID. "RUTINA".
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CAMPO PIC X(20) IS EXTERNAL.
PROCEDURE DIVISION WITH STDCALL LINKAGE.
PERFORM 10 TIMES
DISPLAY "¡¡¡Este es un nuevo Thread!!! Valor recibido: " CAMPO
CALL "Sleep" WITH STDCALL USING BY VALUE 1000
END-PERFORM
DISPLAY "ADIÓS"
CALL "Sleep" WITH STDCALL USING BY VALUE 1000
GOBACK
.
END PROGRAM "RUTINA".