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ındacatch()
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ı ..
Kodunuzu _as code_, bir ekran görüntüsü değil, gönderdiyseniz, _much_ daha iyi olurdu. – ForceBru
Tamam, ama kod satırı numaralandırması hala görünecek mi? –
@FirstStep, olmayacak, ancak her zaman bir yorum yazabilirsiniz. // <- hata buradadır – ForceBru