2016-03-21 16 views
2

Bu kod esas olarak Görüntü İşleme'dir, ancak karşılaştığım şey bir "söz dizimi olduğunu düşünüyor" sözdizimi hatası değildir. Yazmadığım bir uygulama üzerinde çalışıyorum. Bu kodlar birkaç .cpp/C# dosyasıdır. İyi çalışıyordu ama aniden bu garip davranışı yapmaya başladı.Uygulama sırasındaki garip davranış. Konular, uyumsuzluk ve bekletme dahil

Genellikle, kullanıcı 'dan önce line 85 numaralı fotoğraftan bir fotoğraf çeker ve denetim son işlevde sonlanan birkaç işleve (1-> 6) geçilir. Bu son dosya (6) yürütmeyi sonlandırdığında, kontrol geri akar (6-> 1) ve ilk dosyaya bir "case" a sonra switch() kodunu girip, devam edip devam ederiz.

1:

 private async void measureButton_Click(object sender, RoutedEventArgs e) 
     { 
       // .. 
       // some code above 
       var result = await ((CaptureViewModel)DataContext).ProcessMeasurement(); // line 85 

      switch (result) // line 87 <<< Here the switch executes before line 85 finishes executing 
      { 
        // some code and cases below 
        // .... 

2:

public async Task<AnalyzeCode> ProcessMeasurement() 
{ 
    if (currentSession.Type == SessionType.Calibration) 
     return await TakeCalibrationImage(); 

    return AnalyzeCode.NoSessionSelected; 
} 

3:

public async Task<AnalyzeCode> TakeCalibrationImage() 
{ 
    if (calibrationData.Count < maxCalibrationImages) 
    { 
     try 
     { 
      var data = await cameraController.TakeMeasurement(currentSession.Calibration, SessionType.Calibration); 
      // some code below 
      // .. 

4:

public async Task<Measurement> TakeMeasurement(Calibration calibration, SessionType type) 
    { 
     try 
     { 
      switch (type) 
      { 
       case SessionType.Calibration: 
        // some code above 
        // .. 
        return await cameraClient.AnalyzeNextCalibrationAsync(); // line 518 Here it throws an exception error 
        // some code below 
        //.. 

5:

IObservable<Measurement>^ Client::AnalyzeNextCalibrationAsync() 
{ 
    return Observable::ObserveOn(
     Observable::SubscribeOn(
      Observable::Create<Measurement>(
       gcnew Func<IObserver<Measurement>^, Action^>(
       gcnew AnalyzeNextCalibrationSubscribeFactory(this), 
       &AnalyzeNextCalibrationSubscribeFactory::AnalyzeNext)), 
      Scheduler::TaskPool), 
     Scheduler::TaskPool); 
} 
class on_next_functor_3 
{ 
    public: 
      void operator()(const tuple<frame, frame>& pair) const 
      { 
       Action<Measurement>^ on_next_delegate = this->on_next_delegate; 
       on_next_delegate(ConvertToCalibrationMeasurement(pair)); 
      } 
}; 
:

Measurement ConvertToCalibrationMeasurement(const tuple<frame, frame>& pair) 
{ 
     // ... 
     // more code above 
    auto result1 = find_calibration_pattern(master_image); // line 386 
    auto result2 = find_calibration_pattern(slave_image); // line 387 
// .. 
// some code 
// .. 
    return Measurement(// line 401 
     masterImage, 
     slaveImage, 
     ConvertToDateTime(master.time), 
     ConvertToTargets(result)); 
} // end of the function 

Şimdi burada son garip bir davranıştır. Kontrol, 6 ans deyimini kullanarak ifadeyi çalıştırmaya başlar, sonra aniden kontrol 4'e geri döner, bir hata atar ve baştan sona geri döner ve ekranda hatayı çıkaran switch()'u çalıştırır. Daha sonra kontrol, en sonunda line 387'a geri döner ve bu işlevi yürütmeye devam eder. Teknik olarak, önceki ifadenin yürütülmesini tamamlamadan önce switch()'u 1'de yürütüyor. Sonunda sonuç ne olursa olsun, zaten uygulanmış olan “başarısız” durumumuzdan dolayı faydalı olmayacaktır.

Yeryüzündeki herkes bunun neden olacağını biliyor mu? Bu sorun nerede üretilir? ve nasıl düzeltilir? Teşekkür

Düzenleme

:

Exception thrown: 'System.InvalidOperationException' in System.Reactive.Linq.dll 
The thread 0x1574 has exited with code 0 (0x0). 
Exception thrown: 'System.NullReferenceException' in App.exe 

Ve bu dosya 4 hat 518

arasında catch() olur:

Çıktı penceresi (switch() itibaren) bu kez istemi hata gösterir çıkar

İş parçacığı pencereleri, Main Thread denetiminin (Sarı ok) 1-31 arası dosyaya sahip olduğunu gösterir. Bununla birlikte, 4 numaralı dosya 5-> 6'yı çağırdığında, Main Thread denetimi kaybeder ve "sarı ok" 6 yürütmeyi Worker Thread yürütür. Şimdi 6 yürütürken, Main Thread denetimi 4'e geri alır, bir istisna atar ve yürütür. catch() ancak daha sonra Worker Thread'a geri dönmek için kontrolü kaybeder ve 6'yı çalıştırmaya devam eder. Bu normal midir? Ben hiç iş parçacığı ile çalıştım ama bu mantıklı değil ve bir geri dönüş ve daha sonra ileri ve devam etmek için bir işlevi yürütürken bir "akış tatili" görmedim. Ben öğrenme kısmını seviyorum ama bir noob için kafa karıştırıcı ..

+3

Kodunuzu _as code_, bir ekran görüntüsü değil, gönderdiyseniz, _much_ daha iyi olurdu. – ForceBru

+0

Tamam, ama kod satırı numaralandırması hala görünecek mi? –

+1

@FirstStep, olmayacak, ancak her zaman bir yorum yazabilirsiniz. // <- hata buradadır – ForceBru

cevap

0

Iki olası nedeni.

  1. Kodunuzu iki kez aynı anda kullanıyor olabilirsiniz. Muhtemelen farklı konulara aynı anda (eğer evet ise, hata ayıklayıcısında görmek kolay olmalı, “Threads” görünümünü açın). Muhtemelen aynı iş parçacığı üzerinde (çağrılan iş parçacığının beklemesi olasıysa, uygulama bazı async işlemlerini başlattı, iş parçacığı serbest bırakıldı ve tekrar çağrıldı).

  2. Bir VS hata ayıklayıcısı her zaman güvenilir değildir. Çok iş parçacıklı kodları ayıklarken bazen garip adresler görüyorum, ancak bu doğru değil. Doğrulamak için, 87 numaralı satıra günlük kaydı ekleyin, ör. Bu C# ise Debug.WriteLine.

+0

Konu pencerelerini izledim (hiç çalışmamıştım). Ana iş parçacığının bir kez dosya 4'ten 5'e geçtikten sonra bir iş parçacığı olarak değiştirildiğini fark ettim, ancak istisna atıldıktan sonra ana iş parçacığı olmak için geri döndü, bu normal mi? (Daha fazla bilgi için lütfen Düzen bölümüne bakınız). Ve 86 satırında Debug.Writeline (sonuç) yazdım. Çıktısını nasıl izleyebilirim? –

+0

Debug/windows/output, çıkışı göster: Hata ayıklama – Soonts

+0

Sürüm sürümünün neden normal bir şekilde çalıştığı hakkında bir fikriniz var mı? –

İlgili konular