Avatar billede dyrby Nybegynder
05. marts 2002 - 10:45 Der er 12 kommentarer og
2 løsninger

Dialoger og tråde??

Arbejder med MFC c++ i VisualStudio 6.0

Jeg er lidt grøn i det her med tråde... så bær over med mig :)

Mit problem er at jeg skal lave noge initialisering som bliver fortaget via et DLL kald. Denne initialicering er dog ikke afgørende for om min app i øvrigt kan starte op. Derfor:

Jeg vil gerne starte en tåd som tager sig af denne initalicering.. problemet kommer når jeg vil vise en dialog a la. den lille dialog der kommer MSN Messenger når der er en der logger af eller på (et lille vindue der viser nogle basale oplysninger uden at være interagtivt). Dette vidue / dialog skal være på mens den initalisere og selv lukke ned efter den er færdig. Dette alt imens hoved programet køre normalt videre, dog uden de funktioner som kræver denne initalisering... PUHA! håber du er med endnu... kort er spørgsmålet altså:

Hvordan opretter man en tråd som kan håndetere at vise en dialog taget fra recurserne imens Der bliver lavet noget initalisering, hvorefter dialogen / message viduet skal fjernes og træden lukkes ned .

Jeg er tilfreds med et link til et sted på nettet som beskriver en løsning der ligner den jeg skal bruge eller en forklaring på hvordan man kan håndtere dialoger fra recurserne i andre træde end hoved tråden...

Tak for din tålmodighed med mit lange spg.... ;)
vh Dyrby
Avatar billede jpk Nybegynder
05. marts 2002 - 10:57 #1
Hvad med bare at lave en modeless dialog (altså via Create og ikke DoModal), den har jo sit eget message-loop. Den kan du så lade klare initialiseringen.
Avatar billede soepro Nybegynder
05. marts 2002 - 11:06 #2
Som jeg læser dit spørgsmål, skal tråden bare køre mens initialiseringen af DLL'en foregår - og de arealer tråden skal initialiserer ligger i din hovedtråd ?

Tråden skal initialiseres med (minimum) en pointer til den data-struktur som DLL'en i sin tur skal initialisere. DLL'en opfører sig jo (også i denne sammenhæng) som en helt integreret del af hver tråd - mig bekendt vil hovedtråden og undertråden have hver sit datasegment, selvom de bruger samme DLL. (Ellers ville f.eks. strtok(NULL, ",") og andre "halv-statiske" funktioner jo ikke kunne virke.)

Jeg har til en konvertering af gamle DOS-programmer (ikke-event drevne) til Windows lavet noget lignende - dvs. en tråd der kører den egentlige opgave, og en hovedtråd der venter/kører videre når det er afsluttet.

Princippet er noget i denne her stil:

class myClass
{
  public:
  // Data
}
class myInitThread : TThread
{
  // Nogle defs. og metoder
  myInitThread(myClass* ptrData, TDialog* ptrDialog); // constructor
}
void myInitThread::myInitThread(myClass* ptrData, TDialog* ptrDialog)
{
  ptrDialog->Show();
  // Kald dll function med initialisering af data.
  dllInitFunc(ptrData);
  ptrDialog->Close();
}
class myMainForm : TForm
{
  private:
  // Nogle defs.
  myClass      dataToBeInited;
  TDialog*      initDialog;
  myInitThread* initThread;
 
  public:
  void    myMainForm(void);
}

void myMainForm::myMainForm(void)
{
  // Normale constructor ting.
  initDialog = new TDialog(this); // Eller hvordan constructorer til TDialog nu er.
  initThread = new myInitThread(&dataToBeInited, initDialog);
}

I C++ Builder indeholder Thread en OnTerminate event handler, så der ville jeg nok vælge at lade dialogen blive vist i myMainForm constructoren, og så "smække" en myMainForm metode på som OnTerminate handler på tråden - og lade denne OnTerminate handler lukke dialogen igen.
Avatar billede jpk Nybegynder
05. marts 2002 - 11:06 #3
Fx:

CMyDialog* pDlg = new CMyDialog; // Du kan evt lade pointeren være en member
pDlg->Create(IDD_DLG_RESOURCE, this);
Avatar billede dyrby Nybegynder
05. marts 2002 - 11:09 #4
Mit problem er at denne initialisering taget "lang" tid ca 40 sekunder, og jeg vil ikke have at mit hoved program bliver låst i den tid, og hvis man "bare" laver dialogen modeless køre den ikke i en anden tråd :| tak for svaret dog :) Desuden vil jeg gerne lave noget animering af min dialog, og det vil jeg ikke have skal tage tid / låse mit hoved program...  Tak for svaret dog ;)
>> dyrby
Avatar billede jpk Nybegynder
05. marts 2002 - 11:16 #5
Okay, så gør sådan:
// I .h
CWinThread* m_pThread;
static UINT ThreadFunc(LPVOID pParam);

// I .cpp
m_pThread = AfxBeginThread(ThreadFunc, this);

UINT CWhatEverClass::ThreadFunc (LPVOID pParam)
{
// Her viser du dialogen & laver initialiseringen...

return 0;
}
Avatar billede jpk Nybegynder
05. marts 2002 - 11:20 #6
Du kan få fat i dine data fra sådan:

UINT CWhatEverClass::ThreadFunc (LPVOID pParam)
{
// Her viser du dialogen & laver initialiseringen...
CWhatEverClass* pWhatEverClass = (CWhatEverClass*)pParam;
CMyData* pData = pWhatEverClass->GetTheData();

return 0;
}
Avatar billede dyrby Nybegynder
05. marts 2002 - 11:27 #7
Tak for to gode svar... jeg eksperimentere lidt med det og giver point hvis jeg kan få det til at spille :)

jdk -> du er nød til at skrive et "Svar" (ikke kommentar) hvis du vil have point ;)
Avatar billede jpk Nybegynder
05. marts 2002 - 11:33 #8
Jep, det startede jeg jo netop med, så det ikke er nødvendigt at lave alle indlæggene som svar...
Avatar billede dyrby Nybegynder
05. marts 2002 - 11:38 #9
Ikke fordi jeg ønsker at fortsætte i samme rille... jeg kan bare ikke lade være :) Jeg afviste jo dit første svar da det ikke kunne bruges og jeg kan jo ikke gå ud fra at du efterfølgende kommer med at svar der KAN bruges? ;)

mvh Dyrby
Avatar billede jpk Nybegynder
05. marts 2002 - 11:44 #10
Nej, selvfølgelig ikke, det er også helt op til dig selv hvordan du ønsker at gøre det.
Det jeg mener er, at du kunne jo vente lidt med at afvise svaret.
Ofte er det jo ikke ét enkelt indlæg der får folk til acceptere ens forslag, men en serie indlæg, efterhånden som dialogen udvikler sig.

Jeg håber du forstår, det var bestemt ikke ment negativt...
Avatar billede dyrby Nybegynder
05. marts 2002 - 13:08 #11
Ok jeg er kommet et stykke af vejen... men der er noget der undre mig.... MEGET! kan du måske hjælpe jpk?

<snip>
UINT OBActionMessage::ThreadFunc (LPVOID pParam)
{
    OBDialogAnnounce* test = new OBDialogAnnounce;
    test->Create(IDD_ANNOUNCE_MSG, CWnd::FromHandle(GetDesktopWindow()));

    Sleep(2000);
   
    //test.ShowWindow(SW_SHOWNA);
   
    test->DestroyWindow();
    delete (test);

    return 0;
}
</snip>

Det er at selvom "test.ShowWindow(SW_SHOWNA);" er remmet ud så bliver dialogen stadig vist lige efter create()??? hvorfor nu det?
Avatar billede dyrby Nybegynder
05. marts 2002 - 13:09 #12
hov ... test.ShowWindow(SW_SHOWNA) skulle have været test->ShowWindow(SW_SHOWNA);
Avatar billede dyrby Nybegynder
05. marts 2002 - 13:24 #13
Tak for hjælepen drenge... sidste spg havde (selvfølgelig) ikke noget med tråde og gøre... sorry... det var min fejl :)
Avatar billede jpk Nybegynder
05. marts 2002 - 13:59 #14
Hvis du først vil have dialogen vist når du er færdig med initialiseringen, kan du jo bare vente med at kalde Create.

Men det er måske ikke det du vil?
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