Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pseudo-wątki w javasript
Forum PHP.pl > Forum > Po stronie przeglądarki > JavaScript
slammer
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?
lord_t
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.
slammer
Cięzko mówić o procesie w Javascript, dlatego nazwałem to pseudo-wątkiem 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...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.