473,890 Members | 1,355 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

setTimeout and an object's methods

With the following code I can't understand why this.num keeps
incrementing each time I create a new instance of Foo. For each instance
I'm expecting this.num to alert as 1 but keeps incrementing.

Foo = function(type) {
this.num = 0;
this.type = type
this.trigger();
}
Foo.prototype.t rigger = function() {
me = this;
setTimeout("me. test();",1000);
}
Foo.prototype.t est = function() {
this.num++;
alert(this.type + "+" + this.num);
}

f1 = new Foo("a");
f2 = new Foo("b");
f3 = new Foo("c");

Another aspect I can't resolve is why the alert of this.type is "c" each
time. I guess the issues are being caused by the setTimeout. What's
happening and what's a better way to do this?

Andrew Poulos
Mar 5 '06 #1
12 5564
Andrew Poulos wrote:
With the following code I can't understand why this.num
keeps incrementing each time I create a new instance of
Foo. For each instance I'm expecting this.num to alert
as 1 but keeps incrementing.

Foo = function(type) {
this.num = 0;
this.type = type
this.trigger();
}
Foo.prototype.t rigger = function() {
me = this; ^^
Assigning a value to an Identifier that is not declared in any
containing scope results in the creation of a new property of the global
object, the practical equivalent to the runtime creation of a global
variable. And there is only one property of the global object created
the first time - me = this; - is executed, subsequent executions of the
statement do not create the value they just assign that one property of
the global object a new value.
setTimeout("me. test();",1000); ^^^^^^^^^^
The string arguments to - setTimeout - are evaluated after the timeout
has expired. The - me - identifier will be resolved at that time, to
whichever was the last value assigned to the - me - property of the
global object.

Having - setTimeout - delay for one second will give all three object
creation statements time to complete and the - me - property of the
global object will have the value of the - this - reference in the last
object created. When the three setTimouts happen - me - is the object
with the - type - of 'c' and its test method will be called 3 times,
incrementing the - num - property of that single object only.
}
Foo.prototype.t est = function() {
this.num++;
alert(this.type + "+" + this.num);
}

f1 = new Foo("a");
f2 = new Foo("b");
f3 = new Foo("c");
These three statements will be over in milliseconds so they have all
executed prior to the first evaluation/execution of a - setTimeout -
string argument.

Another aspect I can't resolve is why the alert of this.type
is "c" each time. I guess the issues are being caused by
the setTimeout.
The issue is being caused by trying to use one global property to refer
to many object instances. That was never going to work.
What's happening and what's a better way
to do this?


The 'this' shown here is trivial and pointless, so the best way of doing
it is to delete the code and forget about it. The 'this' that is your
real problem context is probably a candidate for three or four possible
approaches the base of which can only be determined by knowing what the
real 'this' actually is.

Richard.
Mar 5 '06 #2
Foo = function(type) {
this.num = 0;
this.type = type
this.trigger();
}
Foo.prototype.t rigger = function() {
me = this;

^^
Assigning a value to an Identifier that is not declared in any
containing scope results in the creation of a new property of the global
object,


What's happening and what's a better way
to do this?


The 'this' shown here is trivial and pointless, so the best way of doing
it is to delete the code and forget about it. The 'this' that is your
real problem context is probably a candidate for three or four possible
approaches the base of which can only be determined by knowing what the
real 'this' actually is.


Thanks for the clear explanation.

My new problem is, what the appropriate way a method be called from
within another method after a defined period of time?

Andrew Poulos
Mar 5 '06 #3
Andrew Poulos wrote:
<snip>
The 'this' shown here is trivial and pointless, so the best
way of doing it is to delete the code and forget about it.
The 'this' that is your real problem context is probably a
candidate for three or four possible approaches the base of
which can only be determined by knowing what the real 'this'
actually is.


Thanks for the clear explanation.

My new problem is, what the appropriate way a method be called
from within another method after a defined period of time?


There are very few situations in javascript where a single 'best' or
'appropriate' way of doing anything can be determined. What should be
done usually depends a great deal on why you want to do something, and
the context in which you want to do it. You are the only person in a
position to provide that information and if you won't you probably won't
get good advice on what to do. At best you may get the first broadly
functional approach that someone chooses to suggest, but that may do you
as much harm as good in the long run.

Richard.
Mar 6 '06 #4
Andrew Poulos wrote:
Foo = function(type) {
this.num = 0;
this.type = type
this.trigger();
}
Foo.prototype.t rigger = function() {
me = this;


^^
Assigning a value to an Identifier that is not declared in any
containing scope results in the creation of a new property of the global
object,

What's happening and what's a better way
to do this?

The 'this' shown here is trivial and pointless, so the best way of doing
it is to delete the code and forget about it. The 'this' that is your
real problem context is probably a candidate for three or four possible
approaches the base of which can only be determined by knowing what the
real 'this' actually is.

Thanks for the clear explanation.

My new problem is, what the appropriate way a method be called from
within another method after a defined period of time?


The 'best' approach will be determined by what you are trying to do.
Start by calling it the same way you would from a totally separate function.

Given your Foo constructor:

var Foo = function(type) {
this.num = 0;
this.type = type
}

Add a 'trigger' method to the prototype that uses setTimeout to alert
the value of 'type':

Foo.prototype.t rigger = function() {
setTimeout('ale rt("' + this.type + '");',1000);
}
'type' is evaluated when the setTimeout object is created, not when
setTimeout runs. Another way is to use a closure:

Foo.prototype.t rigger = function(type) {
type = this.type;
setTimeout(func tion(){ alert(type); }, 1000);
}
Test it:

var f1 = new Foo('a');
var f2 = new Foo('b');
var f3 = new Foo('c');

// Call trigger() out of order
f2.trigger(); // Shows 'b'
f1.trigger(); // Shows 'a'
f3.trigger(); // Shows 'c'

f1.type = 'zz';
f1.trigger(); // Shows 'zz'
My question here is: it seems that a new function object is created each
time the trigger() method is called, is that correct? As a result, each
instance has a local 'type' variable that is given the value of the
'type' property of the object that called it (i.e. this.type).

Otherwise all calls to trigger() would show the last value that type was
set to (i.e. zz since all the code finishes before the first alert appears).

What is also happening is that a closure is formed by the setTimeout
objects having a reference to the 'type' property of the trigger
functions that called them. That may cause memory problems in IE -
though it may require quite a few calls to be significant.
Incidentally, the use of 'type' may be confusing as many DOM objects
have a type property also. You may want to make it 'objType' or
something more meaningful.

--
Rob
Mar 6 '06 #5
RobG wrote:
<snip>
Foo.prototype.t rigger = function(type) {
type = this.type;
setTimeout(func tion(){ alert(type); }, 1000);
}
If - setTimeout - executes a second later can you be certain that the -
type - property of the object still has the same value as the - type -
local variable of the outer function, and will that matter? This is why
you see such as - var self = this; -, so that the inner function could
use - self.type - and read the actual value of the pertinent object
instance property at the time of its execution.

There is also the question of how often - trigger - will be called. If
it is once then creating a new closure within the trigger function on
each execution would not matter. If - trigger - was going to be used
repeatedly it may be better to only create one closure-forming inner
function instance, i.e.:-

function Foo(type) {
var self = this;
this.num = 0;
this.type = type;
this.trigger = function(){
alert(self.type );
};
}

Test it:

var f1 = new Foo('a');
var f2 = new Foo('b');
var f3 = new Foo('c');

// Call trigger() out of order
f2.trigger(); // Shows 'b'
f1.trigger(); // Shows 'a'
f3.trigger(); // Shows 'c'

f1.type = 'zz';
f1.trigger(); // Shows 'zz'
My question here is: it seems that a new function object
is created each time the trigger() method is called, is
that correct?
Yes it is. ECMA 262 makes provision for function objects to be 'joined'
when it not possible to distinguish between them but that cannot be true
here as each new function object has a distinct scope chain assigned to
its internal [[Scope]] property (each contains a unique
Activation/Variable object from its outer function's execution context).
There in also no evidence that any ECMAScript implementations take
advantage of the specification's provision for joining function objects.
As a result, each instance has a local 'type' variable
that is given the value of the 'type' property of the
object that called it (i.e. this.type).
In effect, each instance has a unique Activation/Variable object on its
scope chain and that object has a property named 'type' that corresponds
with the outer function's local variable and holds the value of that
variable.
Otherwise all calls to trigger() would show the last value
that type was set to (i.e. zz since all the code finishes
before the first alert appears).

What is also happening is that a closure is formed by the
setTimeout objects having a reference to the 'type' property
of the trigger functions that called them.
As the - type - property is a primitive value there is no sense in which
new function can have a reference to it. The object referred to by each
function instance is the Activation/Variable object.
That may cause memory problems in IE -
though it may require quite a few calls to be
significant.


No it won't. The memory leak problem is caused by circular references
(not closures as such) between javascript objects and DOM nodes
(effectively ActiveX and COM objects). There are no DOM nodes involved
here.

Richard.
Mar 6 '06 #6
Richard Cornford wrote:
RobG wrote:
<snip>
Foo.prototype.t rigger = function(type) {
type = this.type;
setTimeout(func tion(){ alert(type); }, 1000);
}


If - setTimeout - executes a second later can you be certain that the -
type - property of the object still has the same value as the - type -
local variable of the outer function, and will that matter? This is why
you see such as - var self = this; -, so that the inner function could
use - self.type - and read the actual value of the pertinent object
instance property at the time of its execution.

There is also the question of how often - trigger - will be called. If
it is once then creating a new closure within the trigger function on
each execution would not matter. If - trigger - was going to be used
repeatedly it may be better to only create one closure-forming inner
function instance, i.e.:-

function Foo(type) {
var self = this;
this.num = 0;
this.type = type;
this.trigger = function(){
alert(self.type );
};
}
Test it:

var f1 = new Foo('a');
var f2 = new Foo('b');
var f3 = new Foo('c');

// Call trigger() out of order
f2.trigger(); // Shows 'b'
f1.trigger(); // Shows 'a'
f3.trigger(); // Shows 'c'

f1.type = 'zz';
f1.trigger(); // Shows 'zz'
My question here is: it seems that a new function object
is created each time the trigger() method is called, is
that correct?


Yes it is. ECMA 262 makes provision for function objects to be 'joined'
when it not possible to distinguish between them but that cannot be true
here as each new function object has a distinct scope chain assigned to
its internal [[Scope]] property (each contains a unique
Activation/Variable object from its outer function's execution context).
There in also no evidence that any ECMAScript implementations take
advantage of the specification's provision for joining function objects.
As a result, each instance has a local 'type' variable
that is given the value of the 'type' property of the
object that called it (i.e. this.type).


In effect, each instance has a unique Activation/Variable object on its
scope chain and that object has a property named 'type' that corresponds
with the outer function's local variable and holds the value of that
variable.
Otherwise all calls to trigger() would show the last value
that type was set to (i.e. zz since all the code finishes
before the first alert appears).

What is also happening is that a closure is formed by the
setTimeout objects having a reference to the 'type' property
of the trigger functions that called them.


As the - type - property is a primitive value there is no sense in which
new function can have a reference to it. The object referred to by each
function instance is the Activation/Variable object.
That may cause memory problems in IE -
though it may require quite a few calls to be
significant.


No it won't. The memory leak problem is caused by circular references
(not closures as such) between javascript objects and DOM nodes
(effectively ActiveX and COM objects). There are no DOM nodes involved
here.


Thanks for all the advice (and to RobG).

I can't tell you precisely what I want to do because my client
themselves do not know precisely. Basically there are one or more images
on which "transformation s" - combinations of transparency, position,
source, size... - get (non constant) periodically applied. Some of the
transformations are, for me anyway, relatively complex and so are
themselves separate methods.

On an image I need to apply a series of transformations (randomising the
delay, length of time to apply, and the actual transformation) . So I saw
it as, once the initial image has loaded, as "jumping from
transformation method to transformation method.

There'll be more than one image but less than 12 images to work on.

Though, for the time being, I don't think I need any more help as I have
been given a lot to work with already by you (plural).

Andrew Poulos
Mar 6 '06 #7
VK

Andrew Poulos wrote:
With the following code I can't understand why this.num keeps
incrementing each time I create a new instance of Foo. For each instance
I'm expecting this.num to alert as 1 but keeps incrementing.

Foo = function(type) {
this.num = 0;
this.type = type
this.trigger();
}
Foo.prototype.t rigger = function() {
me = this;
setTimeout("me. test();",1000);
}
Foo.prototype.t est = function() {
this.num++;
alert(this.type + "+" + this.num);
}

f1 = new Foo("a");
f2 = new Foo("b");
f3 = new Foo("c");

Another aspect I can't resolve is why the alert of this.type is "c" each
time. I guess the issues are being caused by the setTimeout. What's
happening and what's a better way to do this?


I don't think you will be ever able to reach what you want in the way
you want. window.setTimeo ut has been implemented waaay in JavaScript
1.0 then no one even thought about constructors, prototypes and stuff.
He runs with this==window and no amount of braces around can change it.
Any attempts to stick some other "this" are going away like water off a
duck's back. So if I'm reading your intentions right:

{
{
{
... and somewhere deep in the instance curlies
setTimeout running for an instance method
...

then NOOP - you cannot do it.

There were some extensive discussion back in 90's (not here), and since
nothing dramatically changed since then, you may stick to this
solution.
You can try to transform setTimeout default into its strength. If it's
guranteed to run in the global scope, so give him a reference in a
window property - you can be sure that it will pick it up.

A sample can be found at
<http://www.geocities.c om/schools_ring/archives/threads.html> and the
code posted at the end of this message - though I'm affraid newsreader
may jam everything.

This sample is a kind of overkill, because I created it while testing
script engine "thread capacity" plus some dynamic styling discrepancies
between browsers. Nevertheless the idea is clear (I hope :-)

1) You give an OID (Object ID) to each instance.
2) On thread start you add new property to the current window where the
key is instance OID and value is instance reference.
3) On thread stop you remove this property.
4) setTimeout is happy to use window[oid].method. setTimeout is happy -
you are happy :-)

P.S. If you are affraid that it's some kind of "concept profanation"
;-) then let me assure you that it's pretty close to what happens in
"big languages". There an instance also gets an OID and then roaming
with it like a transit passenger in the LA International, showing his
ID on each corner. Just in "big languages" it's all done nicely on the
lower level.

// Code from
<http://www.geocities.c om/schools_ring/archives/threads.html>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
"http://www.w3.org/TR/html401/frameset.dtd">
<html>
<head>
<title>window.s etTimeout</title>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
<script type="text/javascript">

function Timer(out) {
// Instance class name:
this.$name = 'Timer';
// Instance OID (Object ID):
this.$oid = this.$name + (new Date()).getTime ();
Timer.$table[this.$oid] = this;
// Output (DOM element):
this.$out = out || null;
// Timer ID:
this.$tid = null;
// Minutes counter:
this.$min = 0;
// Seconds counter:
this.$sec = 0;
// Static methods (shared between instances):
this.start = Timer.$start;
this.$tick = Timer.$tick;
this.stop = Timer.$stop;
this.toString = Timer.toString;
}

Timer.$table = new Object();

Timer.$start = function() {
// Start timer instance:
if (this.$tid == null) {
var oid = this.$oid;
var cmd = 'self[\''+oid+'\'].$tick(\''+oid+ '\')';
self[oid] = this;
this.$tid = window.setTimeo ut(cmd,1000);
return this.$oid;
}
}

Timer.$tick = function(oid) {
// OnTimer instance call:
with (self[oid]) {
$sec++;
if ($sec >= 60) {
$min++;
$sec = 0;
}
if ($out != null) {
$out.innerHTML = this.toString($ min,$sec);
}
var cmd = 'self[\''+oid+'\'].$tick(\''+oid+ '\')';
$tid = window.setTimeo ut(cmd,1000);
}
}

Timer.$stop = function() {
// Stop timer instance:
if (this.$tid != null) {
window.clearTim eout(this.$tid) ;
self[this.$oid] = null;
this.$tid = null;
}
}

Timer.toString = function(m,s) {
var t = '';
if (arguments.leng th < 2) {
t = 'function';
}
else {
t = (m < 10)? '0'+m : m;
t+= ':';
t+= (s < 10)? '0'+s : s;
}
return t;
}

Timer.bDown = function(e) {
// Visual change of pseudo-button on mousedown:
var evt = e || event;
if (evt) {
var trg = evt.target || evt.srcElement;
trg.style.borde rStyle = 'inset';
}
}

Timer.bUp = function(e) {
// Visual change of pseudo-button on mouseup:
var evt = e || event;
if (evt) {
var trg = evt.target || evt.srcElement;
trg.style.borde rStyle = 'outset';
}
}

Timer.action = function(e) {
// Display current instance data and options:
var evt = e || event;
if (evt) {
var trg = evt.target || evt.srcElement;
var oid = trg.title;
var tmp = Timer.$table[oid];
var msg = 'Instance OID: ' + oid +'\n\n';
var val = tmp.toString(tm p.$min,tmp.$sec );
if (self[oid]) {
msg+= 'Currently running\n';
msg+= 'Last value: ' + val + '\n';
msg+= 'Press Cancel to stop, press OK to keep running';
if (window.confirm (msg)) {
tmp.stop();
tmp.$out.style. color = '#CCCCCC';
}
}
else {
msg+= 'Currently idle\n';
msg+= 'Last value: ' + val + '\n';
msg+= 'Press OK to run, press Cancel to keep idle';
if (window.confirm (msg)) {
tmp.start();
tmp.$out.style. color = '';
}
}
}
}

function createTimerBox( i) {
var t = document.create Element('VAR');
t.className = 'timer';
var d = document.create Element('SPAN') ;
d.innerHTML = '00:00';
var b = document.create Element('B');
b.innerHTML = '?';
b.title = (new Timer(d)).start ();
b.tabIndex = ++i;
b.onmousedown = Timer.bDown;
b.onmouseup = Timer.bUp;
b.onclick = Timer.action;
b.onkeypress = Timer.action;
t.appendChild(d );
t.appendChild(b );
return t;
}

function setup(i) {
if (i < 50) {
Graphics.append Child(createTim erBox(i));
window.setTimeo ut('setup('+(++ i)+')',100);
}
}

function init() {
// If IE then Graphics is already referenced,
// otherwise create a global reference:
if ('undefined' == typeof Graphics) {
Graphics = document.getEle mentById('Graph ics');
}
// Fill the screen and start the mess:
window.setTimeo ut('setup(0)',1 00);
}

window.onload = init;
</script>

<style type="text/css">
body {
font: 1em Verdana, sans-serif;
color: #000000;
background-color: #F5F5F5;
margin: 20px 20px;
padding: 0px 0px}

var.timer {
display: -moz-inline-box;
display: inline-block;
position: relative;
left: 0px;
top: 0px;
margin: 5px 5px;
padding: 5px 5px;
border: medium outset;
background-color: #CCCCCC;
font-size: 0.8em;
font-style: normal;
font-weight: bold;
cursor: default}

var.timer span {
display: -moz-inline-box;
display: inline-block;
position: relative;
left: 0px;
top: opx;
margin: 5px 5px;
padding: 5px 10px;
border: medium inset;
color: #CCFF66;
background-color: #006600}

var.timer b {
display: -moz-inline-box;
display: inline-block;
position: relative;
left: 0px;
top: 0px;
margin: 5px 5px;
padding: 5px 10px;
border: medium outset;
cursor: hand;
cursor: pointer}

#Graphics {
position: relative;
left: 0px;
top: 0px
height: auto;
width: 100%;
margin: 0px 0px;
padding: 0px 0px}
</style>
</head>

<body>
<h1>Thread capacity test</h1>
<div id="Graphics"> </div>
</body>
</html>

Mar 6 '06 #8
VK
Heh... I decided to check if the stuff is still alive and found a bug:

....
msg+= 'Press Cancel to stop, press OK to keep running';
if (window.confirm (msg)) {
....

replace to:

....
msg+= 'Press Cancel to stop, press OK to keep running';
if (!window.confir m(msg)) {
....

Otherwise the action doesn't correspond to the chosen option. It's
strange it did not bother me year ago (? :-)

Mar 6 '06 #9
VK wrote:
Andrew Poulos wrote:
With the following code I can't understand why this.num keeps
incrementing each time I create a new instance of Foo. For each instance
I'm expecting this.num to alert as 1 but keeps incrementing.

Foo = function(type) {
this.num = 0;
this.type = type
this.trigger();
}
Foo.prototype.t rigger = function() {
me = this;
setTimeout("me. test();",1000);
}
Foo.prototype.t est = function() {
this.num++;
alert(this.type + "+" + this.num);
}

f1 = new Foo("a");
f2 = new Foo("b");
f3 = new Foo("c");

Another aspect I can't resolve is why the alert of this.type is "c" each
time. I guess the issues are being caused by the setTimeout. What's
happening and what's a better way to do this?


I don't think you will be ever able to reach what you want in the way
you want. window.setTimeo ut has been implemented waaay in JavaScript
1.0 then no one even thought about constructors, prototypes and stuff.
[code]


Utter nonsense, as usual.
PointedEars
Mar 6 '06 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
14971
by: domeceo | last post by:
can anyone tell me why I cannot pass values in a setTimeout function whenever I use this function it says "menu is undefined" after th alert. function imgOff(menu, num) { if (document.images) { document.images.src = eval("mt" +menu+ ".src") } alert("imgOff_hidemenu"); hideMenu=setTimeout('Hide(menu,num)',500);
5
2582
by: oliver | last post by:
Hi, the structure of my source code is like this: <script> C = function(){ //some initialization } C.prototype.start = function{ //some action
4
8413
by: Ken | last post by:
Hello I am trying to change the color of a font in a text box. I have been reading about and trying various examples found it this group, but still can't get it right. Here is where I am now: <script language="JavaScript">
2
4683
by: Athanasius | last post by:
Could someone shed some light as to why the following setTimeout function will not work on the Mac IE5.2? It does however work on PC(Forefox,Netscape,IE) & Mac(Safari,Firefox). Here is the script, it should simply present an alert message after 5 seconds. Thanks. <html> <head> <script language="javascript"> function MsgTimer() { var self = this;
4
1941
by: Telmo Costa | last post by:
I have a HTML page with a form with 2 buttons like this .... <input type="button" value="Add" onClick="ClickAdd();"/> <input type="button" value="Reset" onClick="ClickReset();"/> .... I also have this javascript code: ----------------------------------------
28
5323
by: Andre | last post by:
Hi, Does anyone know whether the ECMA, or an other standard document, specifies a maximum for the value that can be pass to the setTimeOut() function in Javascript? Andre
2
10419
by: rain_c1 | last post by:
hi, i think this is a little exercise for real experts, but i suffer from real headaches because of it... :-\ i have an object method (method1), that calls setTimeout with an other method (method2) as parameter which calls further another method (method3), but i do not know how to realize it. it is important to use object context and not static members, because method3 uses a member (more precisely a constructor parameter) that
15
3807
by: nikki_herring | last post by:
I am using setTimeout( ) to continuously call a function that randomly rotates/displays 2 images on a page. The part I need help with is the second image should rotate 3 seconds after the first image rotates. I cannot figure out how to accomplish the 3 second delay. My code is pasted below: function randPic(){ randPic1(); randPic2();
7
6263
by: -Lost | last post by:
I am calling setTimeout within the context of an object, and whilst this exists, it refuses to be passed along to the function I call. For example: $elemById('id').change = function() { // the function returns the object itself, 'this' exists alert(this); // setTimeout('alert(this);',1000); // }
0
9818
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
11220
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
10806
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
0
10456
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
1
8011
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
5841
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
0
6038
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
2
4267
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
3271
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.