As it has been said before, sometimes it takes a little bit of time for it to take effect. For me it's never been more than 15-30 minutes. Some of it may be the game server your playing on is just a little slow at reporting your stats to EA/Gamespy stats server. Then there is a certain in-game activity that activates the promotion (kill a bad guy or capture a flag) after the next time you log into BF2.
I've notcied that after getting enough points for a promo (I've unlocked 4 guns)... to get the unlock, you may need to log off and log back in a couple of times.
What I usually do.
1) After, I get enough points just past the # of points for a promotion. I'll finish the round (usually this is long enough for the game server to report my stats to the EA/Gamespy stat server) and disconnect and Quit the BF2 game.
2) Open BF2 and log-on and join another online ranked game.
3) Usually, soon after getting my first kill or flag capture (I forget which one actually activates your promo) , the screen will pop up with my new rank and say that I have been promoted. Disconnect from game server and log-off.
4) As soon as you log back on, then the game will tell you that you have been promoted and you can now unlock a gun.