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.
  • _ _Flaviu

    Thank you Victor, can you elaborate a little bit ? Even some pseudo-code will be good :)

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

    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.

    _ 2 Replies 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
      #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