Implementing simple multithreading in C++

Bare steps to implement multi threading in C++:

a. Declare a global variable, to hold the reference counts.

b. Declare CRITICAL SECTION

code:

CRITICAL_SECTION cs_test;
int loadCnt=0;

c. Now everytime you access the code you want to be protected when multiple threads access them

InitializeCriticalSection(&cs_test);
EnterCriticalSection(&cs_test);

if(loadCnt >0)
{
loadCnt++;
return
}else{

//your code here

}

LeaveCriticalSection(&cs_test);

return;

d. you could do the same for de initializing also.

e. But the best way to do the above is to implement them using class and objects.

Windows developer tools you need to have

Some tools which I really find helpful are:

a. Multimon – Support for multiple monitors

b. Process Monitor

c. Process Explorer

d. Desktops – Desktops allows you to organize your applications on up to four virtual desktops.

e. OleView – For COM purposes

f. Spy++ – For windows GUI handling

g. Resource hunter – Reading resource files. It will be helpful when your working on multiple languages.

Tip 1: Optimize code to run faster

1. Use constants with reference when passing values in between methods.

Advantage: It will reduce space and will be faster. If you use a new variable then an additional copy is made and there is a small memory hit.

Ex: method(string val)

optimal usage: method(const string &val)

Here we are passing the value by reference.

ACL: Denying read access to a file in VC++

Snippet of the code to set the permissions and create a file while not granting read access to it:

DWORD dwRes;
PSID pEveryoneSID = NULL, pAdminSID = NULL;
PACL pACL = NULL;
PSECURITY_DESCRIPTOR pSD = NULL;
EXPLICIT_ACCESS ea[2];
SID_IDENTIFIER_AUTHORITY SIDAuthWorld =
SECURITY_WORLD_SID_AUTHORITY;
SID_IDENTIFIER_AUTHORITY SIDAuthNT = SECURITY_NT_AUTHORITY;
SECURITY_ATTRIBUTES sa;

// Create a well-known SID for the Everyone group.
if(!AllocateAndInitializeSid(&SIDAuthWorld, 1,
SECURITY_WORLD_RID,
0, 0, 0, 0, 0, 0, 0,
&pEveryoneSID))
{
printf(“AllocateAndInitializeSid Error %u\n”, GetLastError());
goto Cleanup;
}

// Initialize an EXPLICIT_ACCESS structure for an ACE.
// The ACE will allow Everyone read access to the key.
ZeroMemory(&ea, 2 * sizeof(EXPLICIT_ACCESS));
ea[0].grfAccessPermissions = KEY_READ;
ea[0].grfAccessMode = SET_ACCESS;
ea[0].grfInheritance= NO_INHERITANCE;
ea[0].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[0].Trustee.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP;
ea[0].Trustee.ptstrName = (LPTSTR) pEveryoneSID;

// Create a SID for the BUILTIN\Administrators group.
if(! AllocateAndInitializeSid(&SIDAuthNT, 2,
SECURITY_BUILTIN_DOMAIN_RID,
DOMAIN_ALIAS_RID_ADMINS,
0, 0, 0, 0, 0, 0,
&pAdminSID))
{
printf(“AllocateAndInitializeSid Error %u\n”, GetLastError());
goto Cleanup;
}

// Initialize an EXPLICIT_ACCESS structure for an ACE.
// The ACE will allow the Administrators group full access to
// the key.
ea[1].grfAccessPermissions = KEY_ALL_ACCESS;
ea[1].grfAccessMode = SET_ACCESS;
ea[1].grfInheritance= NO_INHERITANCE;
ea[1].Trustee.TrusteeForm = TRUSTEE_IS_SID;
ea[1].Trustee.TrusteeType = TRUSTEE_IS_GROUP;
ea[1].Trustee.ptstrName = (LPTSTR) pAdminSID;

// Create a new ACL that contains the new ACEs.
dwRes = SetEntriesInAcl(2, ea, NULL, &pACL);
if (ERROR_SUCCESS != dwRes)
{
printf(“SetEntriesInAcl Error %u\n”, GetLastError());
goto Cleanup;
}

// Initialize a security descriptor.
pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR,
SECURITY_DESCRIPTOR_MIN_LENGTH);
if (NULL == pSD)
{
printf(“LocalAlloc Error %u\n”, GetLastError());
goto Cleanup;
}

if (!InitializeSecurityDescriptor(pSD,
SECURITY_DESCRIPTOR_REVISION))
{
printf(“InitializeSecurityDescriptor Error %u\n”,
GetLastError());
goto Cleanup;
}

// Add the ACL to the security descriptor.
if (!SetSecurityDescriptorDacl(pSD,
TRUE, // bDaclPresent flag
pACL,
FALSE)) // not a default DACL
{
printf(“SetSecurityDescriptorDacl Error %u\n”,
GetLastError());
goto Cleanup;
}

// Initialize a security attributes structure.
sa.nLength = sizeof (SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = pSD;
sa.bInheritHandle = FALSE;

// Use the security attributes to set the security descriptor
// when you create a file.
HANDLE hFile = CreateFile( L”C:\\readAccessDenied.txt”,
GENERIC_READ,//FILE_READ_DATA,
FILE_SHARE_READ | FILE_SHARE_WRITE,
&sa,
CREATE_NEW,
0,
NULL );
CloseHandle(hFile);

Cleanup:

if (pEveryoneSID)
FreeSid(pEveryoneSID);
if (pAdminSID)
FreeSid(pAdminSID);
if (pACL)
LocalFree(pACL);
if (pSD)
LocalFree(pSD);

Meego looks promising

Finally Meego has UI to show. It looks pretty interestin.

a. Symbian fonts are finally gone.

b. Looks very much like the iPhone UI

c. Spacious icons.

d. UI development looks easy for developers.

LUA : Method to split a string and output it into a array

First of all i need to give credit to www.wellho.net. I got some code from their website also to implement this.

My basic requirement was to read from the input arguments and display it as a vector of type integers.

Below is the code. Pardon me for the formatting issues. Wordpress sucks when coding:

function string:split(delimiter)
local result = { }
local from  = 1
local delim_from, delim_to = string.find( self, delimiter, from  )
while delim_from do
table.insert( result, string.sub( self, from , delim_from-1 ) )
from  = delim_to + 1
delim_from, delim_to = string.find( self, delimiter, from  )
end
table.insert( result, string.sub( self, from  ) )
return result
end

Then I call the below code from my main method:

have = string.split(inputArgs, “,” )
names= {};
for index,today in pairs(have) do
if today == “1″ then
names[index] = 1;
elseif today == “2″ then
names[index] = 2;
elseif today == “4″ then
names[index] = 4;
end
end

return names; //this returns the vector of integers

Displaying a background image in Android

Goto your res folder as shown in image below add a background image.

After adding a background image, goto the main.xml and add the below text:

<ImageView
android:layout_height=”wrap_content”
android:layout_width=”wrap_content”
android:src=”@drawable/background” />

Note: Do not add the extn to the image name, it wont recognize the file and give an error.

Next goto your main class and add the following:

super(context);
// Set the background
this.setBackgroundDrawable(this.getResources().getDrawable(R.drawable.background));

Another way to do this would be:

Resources res = getResources();
Drawable drawable = res.getDrawable(R.drawable.background);

lets honor our troops – please check it out

Really good slide show: http://www.cnn.com/SPECIALS/war.casualties/index.html

Using CListBox in windows especially in pop up windows

I had an opportunity to use CListbox. The scenario was that I had to pre populate the list box and display it in a pop up window.

Its very to use listbox when using it in a parent window but when you want to display it in a standalone pop up window, you would get an error.

This is because the data is present only after the window comes into picture completely and is gone when the window disappears. In order to rectify this you would need to over rider the Initdialog method as below:

BOOL OnInitDialog()
{
//check if the parent window dialog is also initialized
if(CDialog::OnInitDialog())
{
//enter the values into the listbox here
}
}

By the above code you can enter into a listbox before its displayed.

Declare the below methods in the header file for getting the list selection changes:
afx_msg void OnLbnSelchangeList1();
afx_msg void OnLbnDblclkList1();

Add them to the message map in the class as below:

BEGIN_MESSAGE_MAP(YourClassname, CWnd)
ON_LBN_SELCHANGE(IDC_LIST1, &YourClassname::OnLbnSelchangeList1)
ON_LBN_DBLCLK(IDC_LIST1, &YourClassname::OnLbnDblclkList1)
END_MESSAGE_MAP()

Over ride them with the functionalities you need as below:
void YourClassname::OnLbnSelchangeList1()
{

}

void YourClassname::OnLbnDblclkList1()
{
// TODO: Add your control notification handler code here
}

Use CArray to get the values:

CArray aryListBoxSel;
aryListBoxSel.SetSize(nCurrentSelected);
m_ListBox1.GetSelItems(nCurrentSelected, aryListBoxSel.GetData());
CString sTitle;
int indexVal = 0;

for(int i=0;i<=aryListBoxSel.GetUpperBound();i++)
{
indexVal = aryListBoxSel.GetAt(i);
m_ListBox1.GetText(indexVal, sTitle);
}
---------------------------------------------------------------------------------------------------
Incase CArray gives a error in vc6 you can do the following:

int Count = m_ListBox1.GetSelCount();
if (Count > 0)
{
int *pSels = new int[Count];
m_ListBox1.GetSelItems(Count,pSels);
for (int i = 0; i < Count;i++)
{
//pSels[i] this is the index of the item that was selected
CString Temp;
m_ListBox1.GetText(pSels[i],Temp);
}
delete [] pSels;
}

error C2065: ‘CArray’ : undeclared identifier in visual studio

You would be getting this error if you tried to use CArray in VC 6. You would need to use some other way to get the values selected in listbox. In my next post I would be showing how to use two different ways to access a CListBox.