2013-12-17 1 views
-2

Я понимаю и реализую концепцию Threading в моем приложении. С тех пор все идет хорошо. Но у меня осталось мало вопросов, и они сейчас меня мешают. Буду признателен, если кто-нибудь ответит на любой из нихзапрос о нескольких терминах резьбы

  1. В Createthread() мы можем принять только один аргумент? как я видел на веб-сайте MSDN, и во всех других примерах, которые я видел, я видел только 1 аргумент, LPVOID.

  2. Другое дело в том, что означает возвращаемое значение DWORD WINAPI как возвращаемое значение? Можем ли мы иметь только DWORD, int или любой другой тип возврата. Я полагаю, что это имеет какое-то отношение к HANDLE (может быть)

  3. Я хочу использовать массив потока, следовательно, я изучаю массив для функций, и (как я понял) потоки сами по себе являются просто функцией, называемой по методу CreateThread(), поэтому я попытался реализовать эту концепцию там, но не смог из-за возвращаемого типа DWORD WINAPI не позволял мне это делать?

  4. У меня есть одна нить для сохранения файлов, теперь я хочу его массив, чтобы я мог одновременно сохранять несколько файлов (не то же самое время запуска, а как параллельное сохранение файлов). Как я могу это сделать?

Благодаря Shan

ответ

2
  1. Действительно, вы можете взять только один аргумент, типа void * (LPVOID). Однако, поскольку он может указывать на что угодно, он может указывать на struct или объект (обычно выделяемый в куче для жизненных причин).
  2. WINAPI не является частью возвращаемого значения, это функция , вызывающая Соглашение. Функция должна возвращать DWORD или все, что соответствует . Он не должен вернуть указатель, потому что указатель не может соответствовать DWORD в Win64.
  3. Не понимаю, пожалуйста, уточните, что вы пытаясь сделать.
  4. Обычно для этого вам нужна одна функция потока, передается несколько раз CreateThread() с другим аргументом каждый раз. Не забудьте сохранить ручки потока (которые вы, возможно, сохраните в массиве ), пока вы не прекратите их и не закроете их с помощью CloseHandle().
+0

Для точки 3, похоже, что OP ожидает, что для каждого потока потребуется другая функция.Как вы уже рассмотрели в пункте 4, это необязательно, так как каждый поток может просто выполнять одну и ту же функцию независимо. –

0

для пункта номер три, я думаю, я понял и попробую по-другому. Я использовал

DWORD WINAPI save_uwpi_file0(LPVOID) 
{ 
while(1) 
{ 
    if(release == 1 && flag_oper1 == 1) 
    { 
    int w_cnt = 0; FILE *opfile; 
    char fname[30] = "txt_file0.txt"; 
    //opening file for write 
    opfile = fopen(fname , "w"); 

    printf("assigning memory for file 1 \n"); 
    ssint *Lmem = (ssint *)malloc(sizeof(ssint)*size_of_memory); 

    memcpy(Lmem, pInDMA, sizeof(ssint)*size_of_memory); 
    release = 0; 
    printf("relseaing for second file saving\n"); 
    for(int nbr = 0; nbr < size_of_memory; nbr++){ 
     fprintf(opfile , "%hi\n", Lmem[nbr]); 
     } 
    printf("aligned free 1\n"); 
    free(Lmem); 

    fclose(opfile); 

    printf("File saved 1\n\n"); 
    return 1; 
    } //if statement ends 
} 
} 

и я использую следующие, чтобы указатель на функцию (нить)

DWORD WINAPI (* save_uwpi_file0)(LPVOID); 

Я предполагаю, что я должен попробовать что-то вроде

DWORD (* save_uwpi_file0)(LPVOID); 

я сделаю это и разместите результат здесь

+0

Нет, вы должны использовать 'DWORD WINAPI (* save_uwpi_file0) (LPVOID);' (или просто 'LPTHREAD_START_ROUTINE save_uwpi_file0'), чтобы объявить указатель на функцию потока, и он должен компилироваться без трансляции. – Medinoc

Смежные вопросы