Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Pseudo-wątki w javasript
slammer
post
Post #1





Grupa: Zarejestrowani
Postów: 187
Pomógł: 6
Dołączył: 31.08.2005
Skąd: Bielsko-Biała

Ostrzeżenie: (0%)
-----


Napisałem klasę generującą coś na wzór wątków:
  1. Object.prototype.$ = function(v){
  2. return document.getElementById(v);
  3. }
  4. MyInterval = function (f, t){
  5. this.func = f
  6. this.time = t;
  7. this.handler;
  8.  
  9. this.start = function() {
  10. this.handler = setInterval(this.func, this.time);
  11. }
  12. this.repeat = function(h) {
  13. h.handler = setInterval(h.func, h.time);
  14. }
  15. this.sleep = function(time) {
  16. this.stop();
  17. setTimeout(this.repeat, time, this);
  18. }
  19. this.stop = function() {
  20. clearInterval(this.handler);
  21. }
  22. }
  23. watek :
  24. <div id="watek1"></div>
  25. watek 2:
  26. <div id="watek2"></div>
  27. watek 3:
  28. <div id="watek3"></div>
  29. var i = 0;
  30. animacja = function() {
  31. i+=2;
  32. $('watek1').style.marginLeft = i+'px';
  33. $('watek1').innerHTML = i;
  34. if(i == 26) {watek.sleep(3000)};
  35. if(i == 60) {watek.sleep(3000)};
  36. if(i == 70) {watek.stop()};
  37. }
  38. var j = 0;
  39. animacja2 = function() {
  40. j+=2;
  41. $('watek2').style.marginLeft = j+'px';
  42. $('watek2').innerHTML = j;
  43. if(j == 30) {watek2.sleep(2000)};
  44. if(j == 74) {watek2.sleep(2000)};
  45. if(j == 100) {watek2.stop()};
  46. }
  47. var k = 0;
  48. animacja3 = function() {
  49. k+=2;
  50. $('watek3').style.marginLeft = k+'px';
  51. $('watek3').innerHTML = k;
  52. if(k == 34) {watek3.sleep(1500)};
  53. if(k == 64) {watek3.stop()};
  54. }
  55. watek = new MyInterval(animacja, 500);
  56. watek.start();
  57.  
  58. watek2 = new MyInterval(animacja2, 450);
  59. watek2.start();
  60.  
  61. watek3 = new MyInterval(animacja3, 400);
  62. watek3.start();
  63. </script>

Wszystko jest ok jeśli wywołuje tak jak wyżej lecz jeśli wywołam tak:
  1. watek = new MyInterval(animacja, 500);
  2. watek.start();
  3.  
  4. watek2 = new MyInterval(animacja2, 500);
  5. watek2.start();
  6.  
  7. watek3 = new MyInterval(animacja3, 500);
  8. watek3.start();

to zaczynają dziać się strasznie dziwne rzeczy. Nie dość, że przeskoki idą co 6 (2+2+2) to wykonują się zapewne co 1500 milisekund...

Czy mam jakiś błąd w kodzie, czy tak poprostu zachowuje się Javascript?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
lord_t
post
Post #2





Grupa: Zarejestrowani
Postów: 603
Pomógł: 131
Dołączył: 24.07.2007
Skąd: Górny Śląsk

Ostrzeżenie: (0%)
-----


Wg mnie to przeglądarka 'muli' przy trzech setInterval() naraz. U Ciebie raczej nie ma błędu.

Możnaby jeszcze pokombinować tak, żeby jeśli mamy już określony interwał dla pierwszego wątku, to gdy 2. jest taki sam jak 1., żeby był zmieniany trochę (o 10, 20, 100?), co dla człowieka raczej nie powinno być zauważalne, a być może rozłoży obciążenie.

PS. Swoją drogą fajny pomysł, żeby zrobić wątki w JS:) Chociaż czy to możliwe? Wątki powinny odciążyć proces, a tu się to w nie dzieje.

Ten post edytował lord_t 8.04.2008, 00:00:11
Go to the top of the page
+Quote Post
slammer
post
Post #3





Grupa: Zarejestrowani
Postów: 187
Pomógł: 6
Dołączył: 31.08.2005
Skąd: Bielsko-Biała

Ostrzeżenie: (0%)
-----


Cięzko mówić o procesie w Javascript, dlatego nazwałem to pseudo-wątkiem (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)

Btw. fajny pomysł z tym dodaniem wartości, musze to doklepać do kodu. Tylko w js nie ma żadnej metody na sprawdzenie poszczególnych właściwości w jakiś prosty sposób (jak porównać this.time z this.time). Hmmm może tak w globalnej tablicy...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.12.2025 - 21:56