[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

[MD:570]synchronous fiber



添付の patch で -s option でとりあえず同期 fiber になります。

んが、これだと、あまり、うまくないです^^;;。

複数の fiber が同じアプリケーションを起動する場合、前のプロセスを終
了しないと、次のプロセスが立ち上がりません。(違うアプリケーションの
場合は OK) 終了させれば、立ち上がるので、がまん出来ると言えば、がま
ん出来ますが、気になると言えば、気になります;;

何とかしたいですが、今日はここまで :-P

;; やまもと
*** fiber.c	1998/03/09 04:41:34	1.1
--- fiber.c	1998/03/09 00:19:15
***************
*** 90,96 ****
  #define FIBER_SUBKEY_OVERRIDEEXT       "OverrideExt"
  #define FIBER_SUBKEY_EXTENSION         "Extension"
  
- 
  /* structures */
  typedef struct tagEXTFILE {
    char  szExt[FIBER_EXTLEN+1];
--- 90,95 ----
***************
*** 684,689 ****
--- 683,716 ----
    printf("            -l                     list exts\n");
    printf("            -r <num>               remove ext\n");
    printf("            -i                     initialize\n");
+   printf("            -s                     synchronous mode\n");
+ }
+ 
+ 
+ VOID ShellExecuteSyncOrAsync( HWND hwnd,
+                               LPCTSTR lpVerb,
+                               LPCTSTR lpFile,
+                               LPCTSTR lpParameters,
+                               LPCTSTR lpDirectory,
+                               INT nShow,
+                               BOOL fSynchronous)
+ {
+   if (fSynchronous) {
+     SHELLEXECUTEINFO sei;
+     memset(&sei, 0, sizeof(SHELLEXECUTEINFO));
+     sei.cbSize = sizeof(SHELLEXECUTEINFO);
+     sei.fMask = SEE_MASK_NOCLOSEPROCESS;
+     sei.hwnd = hwnd;
+     sei.lpVerb = lpVerb;
+     sei.lpFile = lpFile;
+     sei.lpParameters = lpParameters;
+     sei.lpDirectory = lpDirectory;
+     sei.nShow = nShow;
+     ShellExecuteEx(&sei);
+     WaitForSingleObject(sei.hProcess, INFINITE);
+   } else {
+     ShellExecute(hwnd, lpVerb, lpFile, lpParameters, lpDirectory, nShow);
+   }
  }
  
  
***************
*** 702,707 ****
--- 729,735 ----
    BOOL fAdd        = FALSE;
    BOOL fRemove     = FALSE;
    BOOL fInitialize = FALSE;
+   BOOL fSynchronous = FALSE;
    int  iRemoveNum;
  #ifdef _DEBUG
    FILE *fp;
***************
*** 757,762 ****
--- 785,793 ----
      } else if ( ! strcmp(argv[i],"-i") ){
        /* -i */
        fInitialize = TRUE;
+     } else if ( ! strcmp(argv[i],"-s") ){
+       /* -s */
+       fSynchronous = TRUE;
      } else {
        /* filename */
        if ( strlen(argv[i]) > sizeof(szInputFile) ){
***************
*** 834,840 ****
    if ( fExt ){
      sprintf(szOpenFile,"%s.%s",szInputFile,szExt);
      CopyFile(szInputFile,szOpenFile,FALSE);
!     ShellExecute(NULL,"open",szOpenFile,NULL,NULL,SW_SHOWNORMAL);
      exit( 0 );
    }
  
--- 865,872 ----
    if ( fExt ){
      sprintf(szOpenFile,"%s.%s",szInputFile,szExt);
      CopyFile(szInputFile,szOpenFile,FALSE);
!     ShellExecuteSyncOrAsync(NULL,"open",szOpenFile,NULL,NULL,SW_SHOWNORMAL,
!                             fSynchronous);
      exit( 0 );
    }
  
***************
*** 843,849 ****
      pt = strchr(szInputFile,':');
      if ( pt ){
        if ( pt > (szInputFile+1) ){ /* "http:","ftp:",... */
! 	ShellExecute(NULL,"open",szInputFile,NULL,NULL,SW_SHOWNORMAL);
  	exit( 0 );
        }
      }
--- 875,882 ----
      pt = strchr(szInputFile,':');
      if ( pt ){
        if ( pt > (szInputFile+1) ){ /* "http:","ftp:",... */
! 	ShellExecuteSyncOrAsync(NULL,"open",szInputFile,NULL,NULL,
!                                 SW_SHOWNORMAL,fSynchronous);
  	exit( 0 );
        }
      }
***************
*** 897,908 ****
    /* go! */
    switch ( state ){
    case STATE_INPUTFILE:
!     ShellExecute(NULL,"open",szInputFile,NULL,NULL,SW_SHOWNORMAL);
      break;
    case STATE_ADDEXT:
      sprintf(szOpenFile,"%s.%s",szInputFile,ef[i].szExt);
      CopyFile(szInputFile,szOpenFile,FALSE);
!     ShellExecute(NULL,"open",szOpenFile,NULL,NULL,SW_SHOWNORMAL);
      break;
    default:
      printf("Error: file not found or supported.\n");
--- 930,943 ----
    /* go! */
    switch ( state ){
    case STATE_INPUTFILE:
!     ShellExecuteSyncOrAsync(NULL,"open",szInputFile,NULL,NULL,SW_SHOWNORMAL,
!                             fSynchronous);
      break;
    case STATE_ADDEXT:
      sprintf(szOpenFile,"%s.%s",szInputFile,ef[i].szExt);
      CopyFile(szInputFile,szOpenFile,FALSE);
!     ShellExecuteSyncOrAsync(NULL,"open",szOpenFile,NULL,NULL,SW_SHOWNORMAL,
!                             fSynchronous);
      break;
    default:
      printf("Error: file not found or supported.\n");