473,748 Members | 10,058 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

multi-threaded app/ using lock

Hey All,

I am using multiple child threads per main thread to download files.
It sometimes appears as if the same file is being downloaded twice. I
am using "lock". Am I using it correctly? Any blantant threading
errors here?

Any opinions would be greatly appreciated.

namespace MainThreadManag ement
{
public delegate string ThreadFinishedC allback();

public class WorkerThread
{
protected string ftpSite;

protected WorkerThread(st ring aFtpSite)
{
ftpSite = aFtpSite;
}
}

public class MainThread : WorkerThread
{
List<stringarrF ileNames = new List<string>();

protected Object GetNextFileLock Obj = new Object(); //locking
object
protected Object NotifyThreadFin ishedLockObj = new Object(); //
locking object

public MainThread(stri ng aFTPSite): base(aFTPSite)
{
}

public void ProcessFilesToD ownload()
{
System.Threadin g.Thread aThread = null;
ChildThread aChildThread;
ArrayList arrChildThreads = new ArrayList();
string sFileName;

//get a list of the files to download
arrFileNames = GetListOfFiles( );

//assume maximum of 10 child threads
for (int i = 0; i < 10; i++)
{
sFileName = GetNextFileName ();

if (sFileName == "") //no more
break;

aChildThread = new ChildThread(
new ThreadFinishedC allback(NotifyT hreadFinished),
sFileName);

aThread = new System.Threadin g.Thread(
new ThreadStart(aCh ildThread.Downl oadFile));

arrChildThreads .Add(aThread);
}

//lets get all threads ready then start them.
for (int j = 0; j < arrChildThreads .Count; j++)
{
aThread = (System.Threadi ng.Thread)arrCh ildThreads[j];
aThread.Start() ;
}

for (int j = 0; j < arrChildThreads .Count; j++)
{
aThread = (System.Threadi ng.Thread)arrCh ildThreads[j];
aThread.Join();
}
}

private string GetNextFileName ()
{
string sFileName;
lock (GetNextFileLoc kObj)
{
if (arrFileNames.C ount 0)
{
sFileName = arrFileNames[0];
arrFileNames.Re moveAt(0);
}
return sFileName;
}
}

//called from child threads using callback
private ChilKatFtp.FTPL isting NotifyThreadFin ished(IsSuccess
aSuccess, string aParent)
{
lock (NotifyThreadFi nishedLockObj)
{
string sFileName = "";
sFileName = GetNextFileName ();
return sFileName;
}
}
}
}

namespace ChildThreadMana gement
{
public class ChildThread : WorkerThread
{
ThreadFinishedC allback NotifyThreadFin ished;
string aFileName;

public ChildThread(Thr eadFinishedCall back aNotifyThreadFi nished,
string aFileName, string aFTPSite)
: base(aFTPSite)
{
NotifyThreadFin ished = aNotifyThreadFi nished;
sFileName = aFileName;
}

public void DownloadFile()
{
Ftp FtpClient = null;
bool bSuccess;

try {
do {
bSuccess = getFtpConnectio n(ftpSite, ref FtpClient);
if (bSuccess)
bSuccess = DoDownloadFile( FtpClient, sFileName);

if (bSuccess)
lImageAttribPro p = NotifyThreadFin ished(lIsSucces s,
lImageAttribPro p.sOrderAttribI D);
else
sFileName = ""; //causes loop to end
} while (sFileName != ""); }
finally {
if (FtpClient != null)
{
if (FtpClient.IsCo nnected))
FtpClient.Disco nnect();
FtpClient.Dispo se();
}
}
}

private bool DoDownloadFile( Ftp FtpClient, string aFileName)
{
//this part works, for simplity of post removed code
return true;
}

private bool getFtpConnectio n(string aFTPSite, ref Ftp aFtpClient)
{
//this part works, for simplity of post removed code
return true;
}
}
}

Feb 8 '07 #1
6 2375
Gina_Marano <gi*******@gmai l.comwrote:
I am using multiple child threads per main thread to download files.
It sometimes appears as if the same file is being downloaded twice. I
am using "lock". Am I using it correctly? Any blantant threading
errors here?
It doesn't look like this is your real code. The constructor for
ChildThread assigns to the variable sFileName, which doesn't appear to
exist as far as I can see. Likewise, your ChildThread constructor takes
2 arguments, but it looks like you're passing in three.

Could you post a short but complete program which demonstrates the
problem?

See http://www.pobox.com/~skeet/csharp/complete.html for details of
what I mean by that.

A few other things to note:

1) Use exceptions for error handling, not boolean return values. It'll
make your code simpler.

2) "break" is a more straightforward way to exit a loop than setting a
variable which is part of the loop condition

The threading itself looks (at first glance) okay, but the code is very
hard to follow.

--
Jon Skeet - <sk***@pobox.co m>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Feb 8 '07 #2
On Feb 8, 12:30 pm, "Gina_Maran o" <ginals...@gmai l.comwrote:
Hey All,

I am using multiple child threads per main thread to download files.
It sometimes appears as if the same file is being downloaded twice. I
am using "lock". Am I using it correctly? Any blantant threading
errors here?

Any opinions would be greatly appreciated.

namespace MainThreadManag ement
{
public delegate string ThreadFinishedC allback();

public class WorkerThread
{
protected string ftpSite;

protected WorkerThread(st ring aFtpSite)
{
ftpSite = aFtpSite;
}
}

public class MainThread : WorkerThread
{
List<stringarrF ileNames = new List<string>();

protected Object GetNextFileLock Obj = new Object(); //locking
object
protected Object NotifyThreadFin ishedLockObj = new Object(); //
locking object

public MainThread(stri ng aFTPSite): base(aFTPSite)
{
}

public void ProcessFilesToD ownload()
{
System.Threadin g.Thread aThread = null;
ChildThread aChildThread;
ArrayList arrChildThreads = new ArrayList();
string sFileName;

//get a list of the files to download
arrFileNames = GetListOfFiles( );

//assume maximum of 10 child threads
for (int i = 0; i < 10; i++)
{
sFileName = GetNextFileName ();

if (sFileName == "") //no more
break;

aChildThread = new ChildThread(
new ThreadFinishedC allback(NotifyT hreadFinished),
sFileName);

aThread = new System.Threadin g.Thread(
new ThreadStart(aCh ildThread.Downl oadFile));

arrChildThreads .Add(aThread);
}

//lets get all threads ready then start them.
for (int j = 0; j < arrChildThreads .Count; j++)
{
aThread = (System.Threadi ng.Thread)arrCh ildThreads[j];
aThread.Start() ;
}

for (int j = 0; j < arrChildThreads .Count; j++)
{
aThread = (System.Threadi ng.Thread)arrCh ildThreads[j];
aThread.Join();
}
}

private string GetNextFileName ()
{
string sFileName;
lock (GetNextFileLoc kObj)
{
if (arrFileNames.C ount 0)
{
sFileName = arrFileNames[0];
arrFileNames.Re moveAt(0);
}
return sFileName;
}
}

//called from child threads using callback
private ChilKatFtp.FTPL isting NotifyThreadFin ished(IsSuccess
aSuccess, string aParent)
{
lock (NotifyThreadFi nishedLockObj)
{
string sFileName = "";
sFileName = GetNextFileName ();
return sFileName;
}
}
}

}

namespace ChildThreadMana gement
{
public class ChildThread : WorkerThread
{
ThreadFinishedC allback NotifyThreadFin ished;
string aFileName;

public ChildThread(Thr eadFinishedCall back aNotifyThreadFi nished,
string aFileName, string aFTPSite)
: base(aFTPSite)
{
NotifyThreadFin ished = aNotifyThreadFi nished;
sFileName = aFileName;
}

public void DownloadFile()
{
Ftp FtpClient = null;
bool bSuccess;

try {
do {
bSuccess = getFtpConnectio n(ftpSite, ref FtpClient);
if (bSuccess)
bSuccess = DoDownloadFile( FtpClient, sFileName);

if (bSuccess)
lImageAttribPro p = NotifyThreadFin ished(lIsSucces s,
lImageAttribPro p.sOrderAttribI D);
else
sFileName = ""; //causes loop to end
} while (sFileName != ""); }
finally {
if (FtpClient != null)
{
if (FtpClient.IsCo nnected))
FtpClient.Disco nnect();
FtpClient.Dispo se();
}
}
}

private bool DoDownloadFile( Ftp FtpClient, string aFileName)
{
//this part works, for simplity of post removed code
return true;
}

private bool getFtpConnectio n(string aFTPSite, ref Ftp aFtpClient)
{
//this part works, for simplity of post removed code
return true;
}
}

}- Hide quoted text -

- Show quoted text -
Hi,

The DownloadFile method will loop until there is an error downloading
the file. I'm surprised the problem isn't more wide spread. I'm not
seeing the need for two different lock objects. The code is difficult
to follow. And I agree that it can't possibly be what you really
have.

Brian

Feb 8 '07 #3
On Feb 8, 1:38 pm, "Brian Gideon" <briangid...@ya hoo.comwrote:
On Feb 8, 12:30 pm, "Gina_Maran o" <ginals...@gmai l.comwrote:


Hey All,
I am using multiple child threads per main thread to download files.
It sometimes appears as if the same file is being downloaded twice. I
am using "lock". Am I using it correctly? Any blantant threading
errors here?
Any opinions would be greatly appreciated.
namespace MainThreadManag ement
{
public delegate string ThreadFinishedC allback();
public class WorkerThread
{
protected string ftpSite;
protected WorkerThread(st ring aFtpSite)
{
ftpSite = aFtpSite;
}
}
public class MainThread : WorkerThread
{
List<stringarrF ileNames = new List<string>();
protected Object GetNextFileLock Obj = new Object(); //locking
object
protected Object NotifyThreadFin ishedLockObj = new Object(); //
locking object
public MainThread(stri ng aFTPSite): base(aFTPSite)
{
}
public void ProcessFilesToD ownload()
{
System.Threadin g.Thread aThread = null;
ChildThread aChildThread;
ArrayList arrChildThreads = new ArrayList();
string sFileName;
//get a list of the files to download
arrFileNames = GetListOfFiles( );
//assume maximum of 10 child threads
for (int i = 0; i < 10; i++)
{
sFileName = GetNextFileName ();
if (sFileName == "") //no more
break;
aChildThread = new ChildThread(
new ThreadFinishedC allback(NotifyT hreadFinished),
sFileName);
aThread = new System.Threadin g.Thread(
new ThreadStart(aCh ildThread.Downl oadFile));
arrChildThreads .Add(aThread);
}
//lets get all threads ready then start them.
for (int j = 0; j < arrChildThreads .Count; j++)
{
aThread = (System.Threadi ng.Thread)arrCh ildThreads[j];
aThread.Start() ;
}
for (int j = 0; j < arrChildThreads .Count; j++)
{
aThread = (System.Threadi ng.Thread)arrCh ildThreads[j];
aThread.Join();
}
}
private string GetNextFileName ()
{
string sFileName;
lock (GetNextFileLoc kObj)
{
if (arrFileNames.C ount 0)
{
sFileName = arrFileNames[0];
arrFileNames.Re moveAt(0);
}
return sFileName;
}
}
//called from child threads using callback
private ChilKatFtp.FTPL isting NotifyThreadFin ished(IsSuccess
aSuccess, string aParent)
{
lock (NotifyThreadFi nishedLockObj)
{
string sFileName = "";
sFileName = GetNextFileName ();
return sFileName;
}
}
}
}
namespace ChildThreadMana gement
{
public class ChildThread : WorkerThread
{
ThreadFinishedC allback NotifyThreadFin ished;
string aFileName;
public ChildThread(Thr eadFinishedCall back aNotifyThreadFi nished,
string aFileName, string aFTPSite)
: base(aFTPSite)
{
NotifyThreadFin ished = aNotifyThreadFi nished;
sFileName = aFileName;
}
public void DownloadFile()
{
Ftp FtpClient = null;
bool bSuccess;
try {
do {
bSuccess = getFtpConnectio n(ftpSite, ref FtpClient);
if (bSuccess)
bSuccess = DoDownloadFile( FtpClient, sFileName);
if (bSuccess)
lImageAttribPro p = NotifyThreadFin ished(lIsSucces s,
lImageAttribPro p.sOrderAttribI D);
else
sFileName = ""; //causes loop to end
} while (sFileName != ""); }
finally {
if (FtpClient != null)
{
if (FtpClient.IsCo nnected))
FtpClient.Disco nnect();
FtpClient.Dispo se();
}
}
}
private bool DoDownloadFile( Ftp FtpClient, string aFileName)
{
//this part works, for simplity of post removed code
return true;
}
private bool getFtpConnectio n(string aFTPSite, ref Ftp aFtpClient)
{
//this part works, for simplity of post removed code
return true;
}
}
}- Hide quoted text -
- Show quoted text -

Hi,

The DownloadFile method will loop until there is an error downloading
the file. I'm surprised the problem isn't more wide spread. I'm not
seeing the need for two different lock objects. The code is difficult
to follow. And I agree that it can't possibly be what you really
have.

Brian- Hide quoted text -

- Show quoted text -
Sorry this isn't the complete program, the program is 200+ lines of
code implementing the FTP and all. I tried to clean it up and dumb
down for posting purposes. I am more interested in the locking logic.

You're right, I don't need the GetNextFileLock Obj locking object. Is
there any thing wrong with NotifyThreadFin ished? Am I correctly
locking it? Is everything declared correctly so when I think I am
deleting the file name from the list, I actually am? Notice that the
child thread is in its own namespace (actually a different unit). I
don't know if this is causing a problem. I am using a callback to the
main thread to get the next file name.

It is hard to reproduce since it is a multi-threaded problem. But
sometimes is appears that 2 threads are trying to download the same
file.

DownloadFile should read:

public void DownloadFile()
{
Ftp FtpClient = null;
bool bSuccess;

try {
do {
bSuccess = getFtpConnectio n(ftpSite, ref FtpClient);
if (bSuccess)
bSuccess = DoDownloadFile( FtpClient, sFileName);

if (bSuccess)
sFileName = NotifyThreadFin ished(); <-----
else
sFileName = ""; //causes loop to end
} while (sFileName != ""); }
finally {
if (FtpClient != null)
{
if (FtpClient.IsCo nnected))
FtpClient.Disco nnect();
FtpClient.Dispo se();
}
}
}

Feb 8 '07 #4
Gina_Marano <gi*******@gmai l.comwrote:
Sorry this isn't the complete program, the program is 200+ lines of
code implementing the FTP and all. I tried to clean it up and dumb
down for posting purposes. I am more interested in the locking logic.
The trick, however, is to still post a complete program.
You're right, I don't need the GetNextFileLock Obj locking object.
Well, you need to lock on *something* when fetching the next file - but
you only need one lock, really. I dno't see any need for
NotifyThreadFin ishedLockObj myself. So long as GetNextFileName is
thread-safe, it should be fine.
Is there any thing wrong with NotifyThreadFin ished? Am I correctly
locking it? Is everything declared correctly so when I think I am
deleting the file name from the list, I actually am? Notice that the
child thread is in its own namespace (actually a different unit). I
don't know if this is causing a problem. I am using a callback to the
main thread to get the next file name.
That shouldn't be the problem.
It is hard to reproduce since it is a multi-threaded problem. But
sometimes is appears that 2 threads are trying to download the same
file.
If it's hard to reproduce, that's all the more reason to try to produce
a short but complete program that demonstrates the problem - even if it
only demonstrates it sometimes.

--
Jon Skeet - <sk***@pobox.co m>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Feb 9 '07 #5
On Feb 9, 3:14 pm, Jon Skeet [C# MVP] <s...@pobox.com wrote:
Gina_Marano <ginals...@gmai l.comwrote:
Sorry this isn't the complete program, the program is 200+ lines of
code implementing the FTP and all. I tried to clean it up and dumb
down for posting purposes. I am more interested in the locking logic.

The trick, however, is to still post a complete program.
You're right, I don't need the GetNextFileLock Obj locking object.

Well, you need tolockon *something* when fetching the next file - but
you only need onelock, really. I dno't see any need for
NotifyThreadFin ishedLockObj myself. So long as GetNextFileName is
thread-safe, it should be fine.
Is there any thing wrong with NotifyThreadFin ished? Am I correctly
locking it? Is everything declared correctly so when I think I am
deleting the file name from the list, I actually am? Notice that the
child thread is in its own namespace (actually a different unit). I
don't know if this is causing a problem. I am using a callback to the
main thread to get the next file name.

That shouldn't be the problem.
It is hard to reproduce since it is a multi-threaded problem. But
sometimes is appears that 2 threads are trying to download the same
file.

If it's hard to reproduce, that's all the more reason to try to produce
a short but complete program that demonstrates the problem - even if it
only demonstrates it sometimes.

--
Jon Skeet - <s...@pobox.com >http://www.pobox.com/~skeet Blog:http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Please send me your more inquiry or requirements to my e-mail address
to ke****@leadingw ay.com.tw

Best regards,

Kelvin Chang

Feb 12 '07 #6
On Feb 9, 3:14 pm, Jon Skeet [C# MVP] <s...@pobox.com wrote:
Gina_Marano <ginals...@gmai l.comwrote:
Sorry this isn't the complete program, the program is 200+ lines of
code implementing the FTP and all. I tried to clean it up and dumb
down for posting purposes. I am more interested in the locking logic.

The trick, however, is to still post a complete program.
You're right, I don't need the GetNextFileLock Obj locking object.

Well, you need tolockon *something* when fetching the next file - but
you only need onelock, really. I dno't see any need for
NotifyThreadFin ishedLockObj myself. So long as GetNextFileName is
thread-safe, it should be fine.
Is there any thing wrong with NotifyThreadFin ished? Am I correctly
locking it? Is everything declared correctly so when I think I am
deleting the file name from the list, I actually am? Notice that the
child thread is in its own namespace (actually a different unit). I
don't know if this is causing a problem. I am using a callback to the
main thread to get the next file name.

That shouldn't be the problem.
It is hard to reproduce since it is a multi-threaded problem. But
sometimes is appears that 2 threads are trying to download the same
file.

If it's hard to reproduce, that's all the more reason to try to produce
a short but complete program that demonstrates the problem - even if it
only demonstrates it sometimes.

--
Jon Skeet - <s...@pobox.com >http://www.pobox.com/~skeet Blog:http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
Please contact me to ke****@leadingw ay.com.tw

Best regards,

Kelvin Chang

Feb 12 '07 #7

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

Similar topics

4
14572
by: OutsiderJustice | last post by:
Hi All, I can not find any information if PHP support multi-thread (Posix thread) or not at all, can someone give out some information? Is it supported? If yes, where's the info? If no, is it possible to make doing multi-thread stuff? Thanks. YF
12
3878
by: * ProteanThread * | last post by:
but depends upon the clique: http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&oe=UTF-8&threadm=954drf%24oca%241%40agate.berkeley.edu&rnum=2&prev=/groups%3Fq%3D%2522cross%2Bposting%2Bversus%2Bmulti%2Bposting%2522%26ie%3DUTF-8%26oe%3DUTF-8%26hl%3Den ...
6
4893
by: Joe | last post by:
I have 2 multi-list boxes, 1 displays course categories based on a table called CATEGORIES. This table has 2 fields CATEGORY_ID, CATEGORY_NAME The other multi-list box displays courses based on a table called COURSES. This table has 2 fields CATEGORY_ID, COURSE_NAME. The CATEGORY_ID is a FK in COURSES and a PK in CATEGORIES. I want to populate the course list box based on any category(s)
4
17873
by: mimmo | last post by:
Hi! I should convert the accented letters of a string in the correspondent letters not accented. But when I compile with -Wall it give me: warning: multi-character character constant Do the problem is the charset? How I can avoid this warning? But the worst thing isn't the warning, but that the program doesn't work! The program execute all other operations well, but it don't print the converted letters: for example, in the string...
23
5329
by: Kaz Kylheku | last post by:
I've been reading the recent cross-posted flamewar, and read Guido's article where he posits that embedding multi-line lambdas in expressions is an unsolvable puzzle. So for the last 15 minutes I applied myself to this problem and come up with this off-the-wall proposal for you people. Perhaps this idea has been proposed before, I don't know. The solutions I have seen all assume that the lambda must be completely inlined within the...
17
10706
by: =?Utf-8?B?R2Vvcmdl?= | last post by:
Hello everyone, Wide character and multi-byte character are two popular encoding schemes on Windows. And wide character is using unicode encoding scheme. But each time I feel confused when talking with another team -- codepage -- at the same time. I am more confused when I saw sometimes we need codepage parameter for wide character conversion, and sometimes we do not need for conversion. Here are two examples,
1
9314
by: mknoll217 | last post by:
I am recieving this error from my code: The multi-part identifier "PAR.UniqueID" could not be bound. The multi-part identifier "Salary.UniqueID" could not be bound. The multi-part identifier "PAR.UniqueID" could not be bound. The multi-part identifier "PAR.PAR_Status" could not be bound. The multi-part identifier "Salary.New_Salary" could not be bound. The multi-part identifier "Salary.UniqueID" could not be bound. The multi-part...
2
4657
by: Aussie Rules | last post by:
Hi, I have a site that Iwant to either display my text in english or french, based on the users prefernces ? I am new to webforms, but I know in winforms, this is pretty easy with a resource file. What is the best way to acheive this with webforms ?
2
5552
by: Mirco Wahab | last post by:
After reading through some (open) Intel (CPU detection) C++ source (www.intel.com/cd/ids/developer/asmo-na/eng/276611.htm) I stumbled upon a sketchy use of multibyte characters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 260: unsigned int VendorID = {0, 0, 0}; try // If CPUID instruction is supported {
4
7327
by: =?Utf-8?B?SGVucmlrIFNjaG1pZA==?= | last post by:
Hi, consider the attached code. Serializing the multi-dimensional array takes about 36s vs. 0.36s for the single-dimensional array. Initializing the multi-dimensional array takes about 4s vs. 0.3s for the single-dimensional array. (I know initializing is not necessary in this simple example,
0
8984
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
1
9312
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
0
9238
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...
0
8237
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
0
4593
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
4864
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
3300
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
2
2775
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
3
2206
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.