2015-10-05 4 views
0

Я когда-то смотрел фильм под названием «Военные игры». Я хотел подражать этой программе в фильме. Я написал простую программу, которая может печатать, а затем говорить предложение, или наоборот. Я хочу, чтобы программа выполнялась одновременно. Как мне это сделать?Многопроцессорность в C

#include <stdio.h> 
#include <wchar.h> 
#include <string.h> 
#include <Windows.h> 
#include <sapi.h> 

ISpVoice *pVoice = NULL; 

void printSmoothly(wchar_t *Str); 

int main(void) 
{ 
    if (FAILED(::CoInitialize(NULL))) 
     return FALSE; 

    HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, 
        IID_ISpVoice, (void **)&pVoice); 

    wchar_t *sentence = L"Greetings professor falken,What would you like to do ?"; 

    // how can i execute these two at the same time ? 
    printSmoothly(sentence); 
    pVoice->Speak(sentence, 0, NULL); 

    pVoice->Release(); 

    CoUninitialize(); 

    return 0; 
} 

void printSmoothly(wchar_t *Str) 
{ 
    size_t len = wcslen(Str) , n ; 

    for(n = 0 ; n < len ; n++) 
    { 
     wprintf(L"%c", Str[n]); 

     Sleep(50); 
    } 
} 
+0

Что это за «C/C++», о котором вы говорите? На каком языке вы используете? –

+0

Я бы предпочел C, вы знаете. –

+1

Тогда пойдем с этим. Включите 'wchar.h', измените« C/C++ »на« C »и удалите тег [tag: C++]. Тогда вам придется что-то делать с этими функциями-членами. –

ответ

4

Вы хотите говорение быть асинхронный.

К счастью, Speak имеет флаг для этого, так что вам не нужно копаться в многопроцессорных еще:

pVoice->Speak(sentence, SPF_ASYNC, NULL); 
printSmoothly(sentence); 

Обратите внимание, что вам нужно, чтобы начать выступление первого, или не начнется до тех пор, печать завершена.

Вам также необходимо позаботиться о том, чтобы вы не Release и CoUninitialize, пока разговор не закончится.
Это произойдет, если вы печатаете быстрее, чем речь, например.
(Асинхронное программирование в действительности намного сложнее, чем в Голливуде.)

+0

Это не очень эффективно. Я попробовал его с предложением, имеющим символ «\ n», и он прекратил говорить, прежде чем читать всю вещь. –

+1

Это звучит как критическая ошибка, а не неэффективность. –

+0

Я скорректировал временные рамки и положил условие на '\ n; знак. ваш ответ приемлемо. –