Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. Change value to a thread

Change value to a thread

Scheduled Pinned Locked Moved C / C++ / MFC
questioncareer
14 Posts 3 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • V Victor Nijegorodov

    Have a look at the [WorkerThreads](http://www.flounder.com/workerthreads.htm) essay of Joe Newcomer. It is MFC issue, but the main concept is the same as for plain Win32 API. Just look at the sections: Pausing a Thread and Thread Shutdown Shutting down a thread from a view or main frame Thread Shutdown Without Polling (Well, you would need something similar to "Pausing" event.

    _ Offline
    _ Offline
    _Flaviu
    wrote on last edited by
    #5

    I have two questions: 1. Why should I use CreateEvent, and if I should, where ? 2. Why should I use WaitForMultipleObjects instead of WaitForSingleObject ?

    V 1 Reply Last reply
    0
    • V Victor Nijegorodov

      Have a look at the [WorkerThreads](http://www.flounder.com/workerthreads.htm) essay of Joe Newcomer. It is MFC issue, but the main concept is the same as for plain Win32 API. Just look at the sections: Pausing a Thread and Thread Shutdown Shutting down a thread from a view or main frame Thread Shutdown Without Polling (Well, you would need something similar to "Pausing" event.

      _ Offline
      _ Offline
      _Flaviu
      wrote on last edited by
      #6

      There will be ideal a little code :)

      L 1 Reply Last reply
      0
      • _ _Flaviu

        I have two questions: 1. Why should I use CreateEvent, and if I should, where ? 2. Why should I use WaitForMultipleObjects instead of WaitForSingleObject ?

        V Offline
        V Offline
        Victor Nijegorodov
        wrote on last edited by
        #7

        1. to inform the worker thread that it must do something (to change the folder in your case). CreateEvent/SetEvent - in the main thread. 2. Because there is already one object: hFileChange. However the thread should react also to the second object created/set by CreateEvent/SetEvent in the main thread.

        1 Reply Last reply
        0
        • _ _Flaviu

          There will be ideal a little code :)

          L Offline
          L Offline
          leon de boer
          wrote on last edited by
          #8

          Ask and you shall receive .. that is it straight on the windows API. GitHub - LdB-ECM/FolderWatcher[^] There is both the detailed and basic thread monitor code. There is a compiled exe in release/debug if you just want to run and see it.

          In vino veritas

          1 Reply Last reply
          0
          • V Victor Nijegorodov

            Yes, you can use CreateEvent, change the folder, set its value in lpParam, then SetEvent to let the thread to reread lpParam and continue to work with a new folder. Note, that thread must now wait for multiple objects!

            _ Offline
            _ Offline
            _Flaviu
            wrote on last edited by
            #9

            Here is what I've done:

            // TestFileView.h : interface of the CTestFileView class

            protected:
            CEvent m_event;
            CString m_sFolder;
            CWinThread* m_pWinThread;

            /*static*/UINT CTestFileView::FilesWatchDogThread(LPVOID lpParam)
            {
            CTestFileView* pView = (CTestFileView*)lpParam;

            if (NULL == pView->GetSafeHwnd())
            	return 1;
            
            HANDLE hChange = FindFirstChangeNotification(pView->GetFolder(), FALSE,	FILE\_NOTIFY\_CHANGE\_FILE\_NAME);
            
            if (INVALID\_HANDLE\_VALUE == hChange)
            	return 1;
            
            HANDLE aHandles\[2\];
            aHandles\[0\] = hChange;
            aHandles\[1\] = pView->m\_event.m\_hObject;
            
            BOOL bContinue = TRUE;
            while (bContinue)
            {
            	DWORD dwResult = WaitForMultipleObjects(2, aHandles, FALSE, INFINITE);
            	switch (dwResult)
            	{
            	case WAIT\_OBJECT\_0:
            		::PostMessage(pView->GetSafeHwnd(), WMU\_NOTIFY\_FOLDERCHANGED, 0, (LPARAM)0);
            		FindNextChangeNotification(hChange);
            		break;
            	case WAIT\_OBJECT\_0 + 1:
            		bContinue = FALSE;
            		break;
            	}
            }
            
            FindCloseChangeNotification(hChange);
            
            return 0;
            

            }

            and

            void CTestFileView::StopThread()
            {
            m_event.SetEvent();
            WaitForSingleObject(&m_event, INFINITE);
            }

            and

            void CTestFileView::OnEditStartthread()
            {
            // TODO: Add your command handler code here

            m\_event.ResetEvent();
            m\_sFolder.Format(\_T("D:\\\\Tempx\\\\"));
            m\_pWinThread = AfxBeginThread(&CTestFileView::FilesWatchDogThread, (LPVOID)this, THREAD\_PRIORITY\_NORMAL, CREATE\_SUSPENDED, 0, NULL);
            

            }

            there is remain one thing to do: to change the folder (m_sFolder) how can I complete this with CreateEvent/SetEvent ?

            _ 1 Reply Last reply
            0
            • _ _Flaviu

              Here is what I've done:

              // TestFileView.h : interface of the CTestFileView class

              protected:
              CEvent m_event;
              CString m_sFolder;
              CWinThread* m_pWinThread;

              /*static*/UINT CTestFileView::FilesWatchDogThread(LPVOID lpParam)
              {
              CTestFileView* pView = (CTestFileView*)lpParam;

              if (NULL == pView->GetSafeHwnd())
              	return 1;
              
              HANDLE hChange = FindFirstChangeNotification(pView->GetFolder(), FALSE,	FILE\_NOTIFY\_CHANGE\_FILE\_NAME);
              
              if (INVALID\_HANDLE\_VALUE == hChange)
              	return 1;
              
              HANDLE aHandles\[2\];
              aHandles\[0\] = hChange;
              aHandles\[1\] = pView->m\_event.m\_hObject;
              
              BOOL bContinue = TRUE;
              while (bContinue)
              {
              	DWORD dwResult = WaitForMultipleObjects(2, aHandles, FALSE, INFINITE);
              	switch (dwResult)
              	{
              	case WAIT\_OBJECT\_0:
              		::PostMessage(pView->GetSafeHwnd(), WMU\_NOTIFY\_FOLDERCHANGED, 0, (LPARAM)0);
              		FindNextChangeNotification(hChange);
              		break;
              	case WAIT\_OBJECT\_0 + 1:
              		bContinue = FALSE;
              		break;
              	}
              }
              
              FindCloseChangeNotification(hChange);
              
              return 0;
              

              }

              and

              void CTestFileView::StopThread()
              {
              m_event.SetEvent();
              WaitForSingleObject(&m_event, INFINITE);
              }

              and

              void CTestFileView::OnEditStartthread()
              {
              // TODO: Add your command handler code here

              m\_event.ResetEvent();
              m\_sFolder.Format(\_T("D:\\\\Tempx\\\\"));
              m\_pWinThread = AfxBeginThread(&CTestFileView::FilesWatchDogThread, (LPVOID)this, THREAD\_PRIORITY\_NORMAL, CREATE\_SUSPENDED, 0, NULL);
              

              }

              there is remain one thing to do: to change the folder (m_sFolder) how can I complete this with CreateEvent/SetEvent ?

              _ Offline
              _ Offline
              _Flaviu
              wrote on last edited by
              #10

              "Go to ParentYes, you can use CreateEvent, change the folder, set its value in lpParam, then SetEvent to let the thread to reread lpParam and continue to work with a new folder" To create a third event which stop the thread and restart FilesWatchDogThread method with new folder value ?

              V 1 Reply Last reply
              0
              • _ _Flaviu

                "Go to ParentYes, you can use CreateEvent, change the folder, set its value in lpParam, then SetEvent to let the thread to reread lpParam and continue to work with a new folder" To create a third event which stop the thread and restart FilesWatchDogThread method with new folder value ?

                V Offline
                V Offline
                Victor Nijegorodov
                wrote on last edited by
                #11

                yes, you create the third event and NOT to stop thread, but to change the folder! Something like:

                case WAIT\_OBJECT\_0 + 2:
                	FindCloseChangeNotification(hChange);
                	hChange = FindFirstChangeNotification(pView->GetFolder(), FALSE,	FILE\_NOTIFY\_CHANGE\_FILE\_NAME);
                	aHandles\[1\] = pView->m\_event.m\_hObject;
                

                And don't forget to set the new folder from the main thread BEFORE setting this event!

                _ 2 Replies Last reply
                0
                • V Victor Nijegorodov

                  yes, you create the third event and NOT to stop thread, but to change the folder! Something like:

                  case WAIT\_OBJECT\_0 + 2:
                  	FindCloseChangeNotification(hChange);
                  	hChange = FindFirstChangeNotification(pView->GetFolder(), FALSE,	FILE\_NOTIFY\_CHANGE\_FILE\_NAME);
                  	aHandles\[1\] = pView->m\_event.m\_hObject;
                  

                  And don't forget to set the new folder from the main thread BEFORE setting this event!

                  _ Offline
                  _ Offline
                  _Flaviu
                  wrote on last edited by
                  #12

                  Yes, has been done. Thank you all of you.

                  1 Reply Last reply
                  0
                  • V Victor Nijegorodov

                    yes, you create the third event and NOT to stop thread, but to change the folder! Something like:

                    case WAIT\_OBJECT\_0 + 2:
                    	FindCloseChangeNotification(hChange);
                    	hChange = FindFirstChangeNotification(pView->GetFolder(), FALSE,	FILE\_NOTIFY\_CHANGE\_FILE\_NAME);
                    	aHandles\[1\] = pView->m\_event.m\_hObject;
                    

                    And don't forget to set the new folder from the main thread BEFORE setting this event!

                    _ Offline
                    _ Offline
                    _Flaviu
                    wrote on last edited by
                    #13

                    Do you meant

                    aHandles[0] = hChange;

                    instead of

                    aHandles[1] = pView->m_event.m_hObject;

                    ?

                    V 1 Reply Last reply
                    0
                    • _ _Flaviu

                      Do you meant

                      aHandles[0] = hChange;

                      instead of

                      aHandles[1] = pView->m_event.m_hObject;

                      ?

                      V Offline
                      V Offline
                      Victor Nijegorodov
                      wrote on last edited by
                      #14

                      Yes! Sorry for the typo! :sigh:

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • World
                      • Users
                      • Groups