如何在C中为Windows创建多线程?

bnlyeluc  于 2024-01-06  发布在  Windows
关注(0)|答案(5)|浏览(154)

我不知道如何在C中创建线程,我看到了一个关于pthread. h库的评论,但后来我听说它只适用于Linux操作系统,我有一个函数,它是一个计时器,我想用这个函数创建一个线程,但我不知道我需要使用的库和语法来编写代码,如果有人能给我一个简单的线程代码,或者告诉我需要放什么东西和函数的参数。
这里是我创建的倒计时用户应用的特定时间的函数:我需要用该函数创建一个线程。
倒计时(Countdown):

#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

void countdown(int second)
{
    int secs = 1;
    time_t unix;
    struct tm * timeinfo;
    time(&unix);
    timeinfo = localtime(&unix);
    int t1 = timeinfo->tm_sec;
    int t2 = timeinfo->tm_sec;
    int i = 0;

    while(1 == 1)
    {
       time(&unix);
       timeinfo = localtime(&unix);
       if((t1 + i)  == timeinfo->tm_sec)
       {
              system("cls");
              printf("Time left %d\n", timeinfo->tm_sec - t2 - second);
              i++;
       }
       if(timeinfo->tm_sec >= (t1 + second))
       {
           system("cls");
           puts("Your time its done");
           break;
       }

    }
}

int main()
{
    int limit;
    printf("How much time would you like (In secs): ");
    scanf("%d", &limit);
    countdown(limit);

    system("PAUSE");
    return 0;
}

字符串

6pp0gazn

6pp0gazn1#

以下是WinAPI线程的简单指南:
http://www.cs.rpi.edu/academics/courses/netprog/WindowsThreads.html (Archived)
也就是说,C是一种极简主义语言,不像Java那样有内置的线程(也没有巨大的额外库)。它是一种通用语言,可以在它的基础上构建。
在类Unix系统上,有超过ANSI/ISO标准的系统级标准C库,它们是POSIX标准的一部分,pthreads是POSIX线程。
Windows C库是MS使事情自己的方式。你可以使用提供多操作系统支持的框架,如GLib或Qt(Windows,Linux,其他 *nix)。也有端口和兼容层在Windows中使用POSIX设施。除了库,MinGW编译器允许你在Win32层上使用POSIX函数的端口。
像GLib和Qt这样的框架最好让你的代码保持多平台,它们隐藏了操作系统的细节,允许更通用的方法。
GLib是用于GUI开发的GTK库的一部分,Qt也是一个GUI开发框架,但在C++中。

s4n0splo

s4n0splo2#

如果你熟悉pthreads和/或想要一个跨平台的代码库,你可以使用MinGWpthreads-win32。我最近在我的一个应用程序中使用了它,它似乎工作得很好。如果你专门为Windows开发,它可能值得你花时间学习redcomet建议的WinAPI线程。

c6ubokkw

c6ubokkw3#

这些标签表明你正在使用Windows。Win32 API有一个CreateThread函数,可以用来启动一个新线程。但是,当你使用C运行时(你是),那么你应该通过包含process.h来使用_beginthread函数。
使用_beginthread的原因是它包含C运行时在线程内正确执行所需的线程特定状态信息。

0pizxfdo

0pizxfdo4#

C标准库没有线程的概念。线程通常是OS中的一个概念。你可以使用win32api来处理线程,就像你在Linux中使用pthread一样(实际上不那么平等。)
要了解更多有关win32api的信息,请访问MSDN。
如何使用win32api创建线程:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682516(v=vs.85).aspx

voase2hg

voase2hg5#

下面是一个用C语言编写的Win32API的单线程和多线程示例程序。

SingleThread_Win.c

#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

#include<Windows.h>

void countdown(int second)
{
    int secs = 1;
    time_t unix;
    .....
    .....
}

DWORD WINAPI funThread(void *x)
{
    int c = (int*)x;
    countdown(c);
    return 0;
}

int main()
{
    int limit;
    printf("How much time would you like (In secs): ");
    scanf("%d", &limit);

    HANDLE  myhandle;
    DWORD threadId;
    myhandle = CreateThread(NULL, 0, funThread, (void *)limit, 0, &threadId);
    if (myhandle == NULL)
    {
        printf("Create Thread Failed. Error no: %d\n", GetLastError);
    }
    WaitForSingleObject(myhandle, INFINITE);
    CloseHandle(myhandle);

    system("PAUSE");
    return 0;
}

字符串

多线程_Win.c

#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define NUM_THREADS 5    // Define number of threads here or take as user input
#include<Windows.h>

void countdown(int second)
{
    int secs = 1;
    time_t unix;
    .....
    .....
}

DWORD WINAPI funThread(void *x)
{
    int c = (int*)x;
    countdown(c);
    return 0;
}

int main()
{
   int limit;
   printf("How much time would you like (In secs): ");
   scanf("%d", &limit);
   //scanf("%d", &NUM_THREADS);    //Take number of threads as Input 

   HANDLE *arrayThread;
   arrayThread = (int*)malloc(NUM_THREADS * sizeof(int));
   DWORD ThreadId;

   for (int i = 0; i < NUM_THREADS; i++)
   {
       arrayThread[i] = CreateThread(NULL, 0, funThread, (void *)limit, 0, &ThreadId);
       if (arrayThread[i] == NULL)
       {
           printf("Create Thread %d get failed. Error no: %d", i, GetLastError);
       }
   }

  WaitForMultipleObjects(NUM_THREADS, arrayThread,TRUE,INFINITE);
  DWORD lpExitCode;
  BOOL result;

  for (int i = 0; i < NUM_THREADS; i++)
  {
    CloseHandle(arrayThread[i]);
  }

  system("PAUSE");
  return 0;
}

相关问题