2015-12-19 1 views
1

Я использую Kinect v2 для записи и выполнения некоторых вычислений на скелете субъекта, который занимает много времени. Я также записываю данные о скелете в лист Excel одновременно, что замерзает программное обеспечение. В результате я использовал Thread для обработки задачи Excel. Он работает гладко, но проблема в том, что когда я пишу на лист Excel, он пропускает некоторые ячейки, как показывает изображение. Любое предложение?Запись в Excel пропускает некоторые данные, используя Thread

enter image description here

testThreadStart11 = new ThreadStart(excelwriter); 
testThread11 = new Thread(testThreadStart11) { IsBackground = true }; 
testThread11.Start(); 


public void excelwriter() 
{ 
     _excelWorksheet.Cells[_excelCol, 1] = _excelRowNum; 
     _excelWorksheet.Cells[_excelCol, 2] = limb1.ToString(); 
     _excelWorksheet.Cells[_excelCol, 3] = limb2.ToString(); 
     _excelCol++; 
     _excelRowNum++; 
} 

ответ

1

Ваш код выглядит, как вы начинаете нить для каждой строки, и сохраняя состояние в своем классе.

Это не будет работать без правильной синхронизации потоков. Другие потоки будут изменять _excelCol и _excelRowNum во время их работы. Если вам просто нужно это, чтобы разгрузить поток пользовательского интерфейса, подумайте только о запуске одного нового потока. Альтернативно добавьте правильную блокировку вокруг изменяющегося состояния.

+0

Я просто хочу, чтобы разгрузить интерфейс, как вам упоминается. Не могли бы вы сообщить мне, что я должен изменить? – cicsosoft

+1

Трудно сказать точно, учитывая ваш очень маленький фрагмент кода. Но, чтобы обобщить, если у вас есть testThread.Start внутри цикла, переместите его за пределы цикла. Вам нужен только один поток. Если вы не уверены, попробуйте установить точку останова в потоке Start(); вызов. – driis

2

В главном магазине нить все значения в очередь и в только один фоновых значений нить записи из этой очереди, чтобы преуспеть

Пример кода:

class Data 
    { 
     public int C1 { get; set; } 
     public int C2 { get; set; } 
     public int C3 { get; set; } 
    } 

    class Program 
    { 
     static Queue<Data> RowsDataQueue = new Queue<Data>(); 
     static void Main(string[] args) 
     { 
      ThreadStart testThreadStart11 = new ThreadStart(excelwriter); 
      Thread testThread11 = new Thread(testThreadStart11) { IsBackground = true }; 
      testThread11.Start(); 
      while (true) 
      { 
       Data RowData = ReadDataFromSomeWhere(); 
       RowsDataQueue.Enqueue(RowData); 
      } 
     } 

     public static void excelwriter() 
     { 
      while (true) 
      { 
       if (RowsDataQueue.Count > 0) 
       { 
        Data D = RowsDataQueue.Dequeue(); 
        //write values in the D to the excel file... 
       } 
      } 
     } 

     private static Data ReadDataFromSomeWhere() 
     { 
      throw new NotImplementedException(); 
     } 
    }