Многопоточность C ++ с разными аргументами командной строки - PullRequest
0 голосов
/ 11 сентября 2018

Я работаю с TightVNC и хотел бы создать приложение, подобное SingleClick UltraVNC. Проблема, с которой я сталкиваюсь, заключается в том, что серверный модуль tvnserver.exe должен запускаться дважды из командной строки: один раз для запуска сервера и второй раз для инициации исходящего соединения. Просматривая исходный код, я сузил его до этого блока кода, который находится в файле tvnserver-app\TvnServerApplication.cpp:

int TvnServerApplication::run()
{
  // FIXME: May be an unhandled exception.
  // Check wrong command line and situation when we need to show help.

  try {
    ServerCommandLine parser;
    WinCommandLineArgs cmdArgs(m_commandLine.getString());
    if (!parser.parse(&cmdArgs) || parser.showHelp()) {
      throw Exception(_T("Wrong command line argument"));
    }
  } catch (...) {
    TvnServerHelp::showUsage();
    return 0;
  }

  // Reject 2 instances of TightVNC server application.

  GlobalMutex *appInstanceMutex;

  try {
    appInstanceMutex = new GlobalMutex(
      ServerApplicationNames::SERVER_INSTANCE_MUTEX_NAME, false, true);
  } catch (...) {
    MessageBox(0,
               StringTable::getString(IDS_SERVER_ALREADY_RUNNING),
               StringTable::getString(IDS_MBC_TVNSERVER), MB_OK | MB_ICONEXCLAMATION);
    return 1;
  }

  // Start TightVNC server and TightVNC control application.
  try {
    m_tvnServer = new TvnServer(false, m_newConnectionEvents, this, &m_fileLogger);
    m_tvnServer->addListener(this);
    m_tvnControlRunner = new WsConfigRunner(&m_fileLogger);

    int exitCode = WindowsApplication::run();

    delete m_tvnControlRunner;
    m_tvnServer->removeListener(this);
    delete m_tvnServer;
    delete appInstanceMutex;
    return exitCode;
  } catch (Exception &e) {
    // FIXME: Move string to resource
    StringStorage message;
    message.format(_T("Couldn't run the server: %s"), e.getMessage());
    MessageBox(0,
               message.getString(),
               _T("Server error"), MB_OK | MB_ICONEXCLAMATION);
    return 1;
  }
}

Что мне нужно сделать, так это многопоточность последней области попытки, в которой он выполняется:

int exitCode = WindowsApplication::run();

Я пытался следовать этому уроку: https://www.bogotobogo.com/cplusplus/multithreading_win32A.php переместил этот блок попытки внутрь раздела myThread, но тогда все остальные вещи, такие как m_tvnServer, не определены.

Я хотел бы запустить поток 2 раза, один раз с аргументом командной строки -run и второй раз с помощью -connect support.mydns.com. Я думал что-то вроде этого:

    unsigned int myCounter = 0;
    DWORD myThreadID;
    string CommandLineArgs[2] = {"-run", "-connect support.mydns.com"};
    for(int i=0; i<2; i++) {
        HANDLE myHandle = CreateThread(0, 0, myThread, CommandLineArgs[i];, 0, &myThreadID;);
    }

Буду признателен за любую помощь, которую вы можете предложить.

...