Конференция ".Net" » И снова про потоки...
 
  • GlFox © (23.08.07 12:13) [0]
    Вот примерчик на C#:

    class CAppCtx{
     public CAppCtx(){
       DocRetStart();
     }


     private void DocRetStart(){
    // Thread.CurrentThread.ManagedThreadId=10
       CDocRet objDocRet=new CDocRet();
       objDocRet.DRCallback=this.DocRetCallback;
       objDocRet.StartWork();
     }


     private int DocRetCallback(CDocRet DocRet, int iStatus){
       return 0;
     }

    }

    public delegate int TDocRetCallback(CDocRet DocRet, int iStatus);

    public class CDocRet{
     public TDocRetCallback DRCallback;

     public CDocRet(){
       DRCallback=null;
     }


     public int StartWork(){
       Thread thDocRet=new Thread(this.ThreadRoutine);
       thDocRet.Start();
       return 0;
     }


     private void ThreadRoutine(){
    // Thread.CurrentThread.ManagedThreadId=11
       while(true){
         if(null!=DRCallback) DRCallback(this,0);
         Thread.Sleep(100);
       }

     }
    }


    Как устроить так, чтобы при вызове метода из CAppCtx.DocRetCallback() из CDocRet.ThreadRoutine() Thread.CurrentThread.ManagedThreadId=10, а не 11 как в данном случае? Т.е. как можно инициировать работу из другого потока?
  • Александр Иванов © (23.08.07 15:39) [1]
    Устроить это просто. Запускать метод в том же потоке и будут у них ID совпадать. Сейчас же в одном потоке создается экземпляр класса CDocRet, затем вызывается его метод, который создает новый поток и в этом потоке выполняется метод ThreadRoutine, в котором естественно будет другой ID.
    Самый простой совет - отказаться от создания потока, и будет задача выполнена.
    Посложнее - понять задачу, а что же надо сделать вообще.
  • GlFox © (23.08.07 15:51) [2]
    Второй поток создается не только для того, чтобы вызывать в цикле метод из другого класса. Он выполняет свою параллельную задачу и просто при опрделенных событиях вызывает callback, после чего продолжает свою работу... Для упрощения понимания весь этот код не показан в приведенном примере.
  • Александр Иванов © (23.08.07 15:54) [3]
    Неважно что. Если он действительно выполняет метод ThreadRoutine, то внутри этого метода ID потока будет другим.
    А код упрощать не надо, когда показываете, лучше показать часть, но упрощение Ваши ошибки скрыть может.
  • GlFox © (23.08.07 15:58) [4]
    Я поясню... Речь идет скорее о том, как лучше передать сообщение (вызвать событие) в другой поток. И при данной реализации естественно ID потока получается другой, т.к. вызывается в дочернем потоке. А хотелось бы, чтобы он вызывался в родительском... после сигнала из дочернего.
  • sdts (23.08.07 16:50) [5]
    http://msdn2.microsoft.com/en-us/library/ms993020.aspx
    может это то что надо?
  • GlFox © (23.08.07 17:27) [6]
    Читали мы уже такое - не совсем то... Но все равно, спасибо.
 
Конференция ".Net" » И снова про потоки...
Есть новые Нет новых   [134427   +35][b:0][p:0.001]