Avatar billede quiw Nybegynder
08. januar 2006 - 21:16 Der er 9 kommentarer og
1 løsning

Multithreading med Funktioner

Hej Eksperter .. Jeg har længe undersøgt multithreading .. Men kan ikke finde nogen konkret forståelse.. Så jeg søger et meget meget simpelt eksempel på hvordan man kan lave 2 funktioner som kører samtidig .. F.eks. ved at få denne afspiller til at afspille mens den tæller .. Er det muligt?
- Søger et meget meget simpelt eksempel ud fra min kode:

#include <iostream.h>
#include <windows.h>
#include <stdio.h>
using namespace std;

int main(int argc, char **argv)
{
    int sec = 0;
    int playing = 0;
   
    // Første Thread
    playing = 1;
    PlaySound("a.wav", NULL, SND_FILENAME);
    playing = 0;
   
    // Anden Thread
    while(playing==1)
    {
    sec++;
    Sleep(1000);
    cout << "The player has played in: "<<sec<<"Sec. \r";
    }
   
    return 0;
}

På Forhånd mange Tak :)
Avatar billede arne_v Ekspert
08. januar 2006 - 21:48 #1
super simpelt eksempel:

#include <iostream>

using namespace std;

#include <windows.h>

CRITICAL_SECTION cs;

DWORD __stdcall tfunc(void *p)
{
  int *arg = (int *)p;
  for(int i=0;i<10;i++)
  {
      EnterCriticalSection(&cs);
      cout << *arg << endl;
      LeaveCriticalSection(&cs);
      Sleep(1000);
  }
  return 0;
}

int main()
{
  InitializeCriticalSection(&cs); 
  int arg1 = 123;
  DWORD id1;
  HANDLE h1 = CreateThread(NULL,0,tfunc,&arg1,0,&id1);
  int arg2 = 456;
  DWORD id2;
  HANDLE h2 = CreateThread(NULL,0,tfunc,&arg2,0,&id2);
  WaitForSingleObject(h1,INFINITE);
  WaitForSingleObject(h2,INFINITE);
  return 0;
}
Avatar billede quiw Nybegynder
08. januar 2006 - 21:53 #2
Hehe .. Mange Tak .. Men tænkte primært på om du kunne sætte mit eksempel ind ?.. Sådan at jeg har en idé om hvordan det fungere ..
Avatar billede bertelbrander Novice
08. januar 2006 - 22:00 #3
PlaySound har et SND_ASYNC flag, der får den til at afspille lyden i baggrunden, så hoved programmet kan lave andet imens.

Se f.ex:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_playsound.asp
Avatar billede quiw Nybegynder
08. januar 2006 - 22:07 #4
bertelbrander - Mange tak .. Hehe .. Men det er primært for at finde ud af hvordan multithreading virker .. For at få en simpel skabelon jeg selv kan forstå .. Sådan jeg eventuelt kunne udskifte "Afspilningens Funktionen" med noget andet ..
(Er meget besværlig)
Avatar billede bertelbrander Novice
08. januar 2006 - 22:12 #5
Det kunne se sådan ud:
#include <iostream>

using namespace std;

#include <windows.h>

DWORD __stdcall ThreadFunc(void *lpParameter)
{
  DWORD MainThread = (DWORD )lpParameter;
  PlaySound("a.wav", 0, SND_FILENAME);
  PostThreadMessage (MainThread, 1000, 0, 0);
  return 0;
}

int main()
{
  DWORD ThreadId;
  DWORD MainThreadId = GetCurrentThreadId();
  cout << "Start thread" << std::endl;
  CreateThread(0, 0, ThreadFunc, (LPVOID )MainThreadId, 0, &ThreadId);
  cout << "Thread started" << std::endl;

  MSG msg;
  GetMessage(&msg, NULL, 0, 0xFFFF);
  cout << "Message received" << std::endl;
  return 0;
}
Avatar billede arne_v Ekspert
08. januar 2006 - 22:15 #6
hvis det kun er selve teknikken, så har mit eksempel vel de fleste af de
ting du skal bruge: start af tråd, overførsel af info til tråd, vente på tråd,
synkronisere mellem tråde
Avatar billede quiw Nybegynder
08. januar 2006 - 22:29 #7
Well .. Har forstået pointen nu .. Ved hjælp af begge svar .. Men hvordan skal point fordeles ? :)
Avatar billede bertelbrander Novice
08. januar 2006 - 22:32 #8
Jeg samler ikke på point.
Avatar billede arne_v Ekspert
08. januar 2006 - 22:33 #9
svar
Avatar billede quiw Nybegynder
08. januar 2006 - 22:35 #10
Sådan :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester