[ _Doctor_ @ 25.09.2005. 00:31 ] @
Prvo pozdrav svima i nadam se da cce neko mocci da mi pomogne u vezi thread-ova. Naime o chemu se radi, pa ovako: Pocheo sam da modifikujem tetris tj. da zamenim timer sa thread-om (Koliko je to teshko nisam ni sanjao). Shta se deshava? Dobijam sledecci exception:

"Controls created on one thread cannot be parented to a control on a different thread"

u trenutku kada je figura pala do kraja tj. u tom trenutku se poziva funkcija koja prikazuje u NEXT panel-u sledeccu figuru.

Deo koda:

private void Tick (){
while(!gameEnd){
if(generator.canMoveDown(currPiece)){
currPiece.moveDown();
} else {
collector.addElemRange (currPiece.getElems());
currPiece = nextPiece;

if(collector.removeRows()) { // Ako je doslo do brisanja reda.

deletedRows += collector.DELETED_ROWS;
points += collector.DELETED_ROWS * collector.DELETED_ROWS * 100;

int val = prbLevel.Value;
val += collector.DELETED_ROWS;
if(val >= prbLevel.Maximum)
val = val - prbLevel.Maximum;

prbLevel.Value = val;


if(deletedRows >= gameLevelLimit && gameLevel < 12){ // Setting game level
levelUp();
lblLevelNum.Text = gameLevel.ToString();
//timGame.Interval = gameSpeed;
}

lblPointsNum.Text = points.ToString();
lblRowsNum.Text = deletedRows.ToString();

}

if(generator.canAddPiece()) {
gameField.Controls.AddRange(currPiece.getElems());
showNext(); // OVDE PUCA PROGRAM
} else {
if(gameOver.ShowDialog() == DialogResult.OK){
newGame();
} else {
gameEnd = true;
}
}
}
Thread.Sleep(gameSpeed);
}
}

Treba mi samo ideja tj. u kom pravcu da razmishljam u radu sa thread-ovima. Svestan sam da su thread-ovi jedan od problematichnijih delova programiranja ali shta da radim kad nisam imao gde drugde da se obratim. Unapred hvala svima na pomocci i nadam se da nisam previshe trazzio.

[Ovu poruku je menjao _Doctor_ dana 25.09.2005. u 01:33 GMT+1]
[ milanche @ 25.09.2005. 06:58 ] @
Sudeci po tekstu greske koji si dobio, verovatno se radi o ogranicenju koje postoji jos
u ranijim verzijama multithread sistema na Windows-u.

Sustina problema je da je jedino glavnom thread-u aplikacije dozvoljeno da pristupa
kontrolama (tj. da zove metode direktno). Svi ostali worker thread-ovi ne mogu da
pristupaju direktno.

Razlog za ogranicenje je sto je glavni thread brizljivo integrisan u Windows okruzenje,
sinhronizovan sa mnostvom procesa vezanih za odrzavanje vizuelne iluzije prozora.
Dozvoliti ostalim thread-ovima da uskacu je moguce, ali bi zbog uvodjenja dodatnih
sinhronizacionih mehanizama grdno usporilo celu pricu.

Nacin da worker thread izvrsi update-ovanje kontrole mora da bude indirektan. Obicno
je to asinhrono post-ovanje (PostMessage( )) custom-definisanih poruka za koje glavni
thread reaguje za to definisanim handler-ima.

Za konkretnu realizaciju, pogledaj .NET dokumentaciju, i/ili sacekaj dopise ljudi koji se
vise bave .NET-om nego ja.
[ dusty @ 26.09.2005. 10:37 ] @
Pogledaj MethodInvoke, bilo je ranije price o istom na ovom forumu.