Я делаю программу, которая выводит точки на экран. каждая точка обрабатывается для некоторых взаимодействий с другими точками. а затем redr aws точки в новой позиции и начинается снова. Проблема в скорости. ive попытался разбить обработку списка на несколько потоков, однако накладные расходы замедлили его. Я также пробовал Parallel.ForEach, и он работает намного лучше. однако я думаю, что накладные расходы все еще существуют. Таким образом, обработка новых позиций происходит поэтапным методом.
private void Step ( ) {
Parallel.ForEach( AllParticles , ( p ) => { // has overheads :(
p.Step( ); // compare to other points
});
foreach ( Particle p in AllParticles ) {
p.Finalise( );
...
}
Draw( );
}
Теперь я мог бы сделать что-то вроде этого
//thread delegate
void ThreadLoop( ) {
for ( ; ; ) {
// Wait for signal . . .
(int start, int end) signal=WaitForSignal();// get a tuple(int,int)
//process given work
for(int idx=signal.start; idx < signal.end;idx++) {
p[ idx ].Step;
}
//set a state to indicate now idle
// repeate and wait for next signal
}
}
List<Thread> CreateAndStart(int numberofthreads ) { // only needs to create threads and delegates once
List<Thread> result=new List<Thread>();
// create and start threads add to list...
return result;
}
void Step(){
//divide the work into [numberOfThread]s
//send signal to each thread
//wait untill each thread is idle
foreach ( Particle p in AllParticles ){
p.Finalise( );
...
}
Draw( );
}
, но я не могу понять, как ввести сигнал и определить, когда хреды ждут. Если у кого-нибудь есть представление о том, как сделать это правильно или есть лучший способ go, я был бы очень благодарен. спасибо